如何跨表执行嵌套属性的连接/合并?

时间:2015-07-07 22:39:57

标签: rethinkdb reql

我有一个表(数据库名称为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_namegetFieldeqJoin()获取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
            },
        ]
    }

2 个答案:

答案 0 :(得分: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')
    })
  })
  }
})

答案 1 :(得分:0)

以下是 NAIVE IMPLEMENTATION 的缩短版本,以防有人遇到类似问题:

import 'uploader.html';
import 'uploader.js';
Template.profilePicModal.events({
 'click #save': function(e) {
  e.preventDefault();


});



    Modal.hide('profilePicModal');
 }


});

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