Rethinkdb:包含嵌套doc的子文档

时间:2014-10-24 17:31:50

标签: rethinkdb

我正在执行一项操作,但它确实有效,但我想知道是否有更好或更有效的方法来做我想要的事情。

我的数据库中有一个对象,如下所示:

{
    "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)
        })
      }
    })
  } 
})

我的问题是:有更有效的方法吗?或者,我应该采用一种完全不同的思维方式来做这件事吗?

谢谢你们!

1 个答案:

答案 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,因为它不知道是否足以知道缓存这些值是否安全。