我有一个表(数据库名称为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
,getField
和eqJoin()
获取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
},
]
}
答案 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之外的库中还有其他字段,它们也会加入)