2

我有一个表(数据库名是libstats,表名是flowcells),里面装满了文件,所有文件都有这样的结构:

{
        "barcode": "C3W9UACXX",
        "id": "0021732f-2c42-4e9a-90fd-c68bb0d998dc",
        "libraries": [
            {
                "bases": 2431000000,
                "library_id": "SL58263",
                "perc_raw_clusters": 5.5,
                "pf_reads": 24312986,
                "q30": 92.23,
                "qscore": 35.82,
                "reads": 25834646,
                "lane": 1
             },...
         ]
}

'libraries' 数组中的对象将始终显示键。我需要添加另一个密钥library_name

libraries在另一个数据库libraries中有另一个表,其中包含此library_name信息。这是该表中的示例文档:

{
   library_id: 'SL123456',
   library_name: 'my_library_name'
}

我如何使用 ReQL 来完成此任务?我已经做到了这一点:

r.db('libstats').table('flowcells').merge(function(flowcell){
  return {'libraries': flowcell('libraries').map(function(library){
    return library.merge(
       {'library_name': 'foo'}
      )
  })
  }
}).limit(1)

它给出了我想要的结构的输出,但是我所有使用,获取library_name属性的尝试,到目前为止都证明是徒劳的:getFieldeqJoin()merge()

{
        "barcode": "C6841ANXX",
        "id": "007cae10-de3c-44df-9aee-1de9c88c1c21",
        "libraries": [
            {
                "bases": 194000000,
                "lane": "1",
                "library_id": "SL91807",
                "library_name": "foo",
                "perc_raw_clusters": 0.9,
                "pf_reads": 1942910,
                "q30": 96.55,
                "qscore": 36.06,
                "reads": 2045599
            },
        ]
    }
4

2 回答 2

2

幼稚的实现

您可以执行以下操作:

r.db('libstats').table('flowcells').merge(function(flowcell){
  return {'libraries': flowcell('libraries').map(function(library){
    return library.merge({ 
      // Query the `libraries` table
      'library_name': r.db('libraries').table('libraries')
        // Filter out certain elements
        .filter(function (row) {
          // Return all elements where the `library_id` is equal to 
          // the `library_id` in the `libstats` table
          return row('library_id').eq(library('library_id'))
        })
        // Return the `library_name` for the first element
        (0)('library_name')
    })
  })
  }
})

请记住,您也可以为此使用二级索引,并使其更简单、更高效。

更好的解决方案

如果您有很多文档(10K+),您需要创建一个索引library_id并使用以下查询:

r.table('libstats').merge(function(flowcell){
  return {'libraries': flowcell('libraries').map(function(library){
    return library.merge({ 
      // Query the `libraries` table
      'library_name': r.table('libraries')
        // Filter out certain elements
      .getAll(library('library_id'), { index: 'library_id' })(0)('library_name')
    })
  })
  }
})
于 2015-07-07T22:57:15.660 回答
0

如果有人遇到类似问题,这是一个NAIVE IMPLEMENTATION的简短版本:

r.db('libstats').table('flowcells').merge(function (flowcell) {
    return { libraries: flowcell("libraries").eqJoin("library_id", r.db("libraries").table("libraries") ).zip() };
})

(如果库中除了 id 和 name 之外还有其他字段,它们也会被加入)

于 2016-12-16T20:59:05.230 回答