我正在执行一项操作,但它确实有效,但我想知道是否有更好或更有效的方法来做我想要的事情。
我的数据库中有一个对象,如下所示:
{
"id": "testId",
"name": "testName",
"products": [
{
"name": "product1"
"info": "sampleInfo",
"templateIds": [
"asdf-1",
"asdf-2"
]
},
{
"name": "product2"
"info": "sampleInfo",
"templateIds": [
"asdf-1",
"asdf-2"
]
}
]
}
正如您所看到的,每个"产品"在"产品" array有一个templateIds的子数组。这些匹配模板存储在另一个表中。我想要做的是创建一个查询,在我将它们全部发回之前将这些模板合并到每个产品对象上。
目前我正在使用子合并:
r.table('suites').get('testId').merge(function(suite){
return {
products: suite('products').merge(function(product){
return {
templates: r.expr(product('templateIds')).map(function(id) {
return r.table('templates').get(id)
})
}
})
}
})
我的问题是:有更有效的方法吗?或者,我应该采用一种完全不同的思维方式来做这件事吗?
谢谢你们!
答案 0 :(得分:1)
这对我来说是对的。我唯一能想到的是r.table('templates').get_all(r.args(product('templateIds')))
比product('templateIds').map(function(id){ return t.table('templates').get(id);})
短,可能更快。
编辑:如果您拥有少量模板,那么使其运行更快的另一件事就是在客户端进行替换,并按ID缓存检索到的模板。 RethinkDB将不得不为每个模板ID单独读取,即使它反复看到相同的模板ID,因为它不知道是否足以知道缓存这些值是否安全。