MongoDB嵌套查找,3层,最后一层有2个外键



我有三个集合,分别是recordSet,ecgexportingRegion。第一级有一个外键,第二级是source。当我检查其他主题时,第3层只有第2层的1个外键。

然而,在这种情况下,我有两个外键,它们连接到第一级和第二级。

我想在查询最后一层时添加更多的约束,但我认为它不起作用。你能帮我查一下查询吗?如有任何意见,欢迎指教。

下面是我的3个集合和数据样本。

记录集

{ "_id" : "1", "name" : "recordSet1", "source" : [1, 2, 3] }
{ "_id" : "2", "name" : "recordSet2", "source" : [1, 4, 5] }

心电图

{ "_id" : "1", "name_ecg" : "test1", "channel" : [ "I", "II", "III" ] }
{ "_id" : "2", "name_ecg" : "test2", "channel" : [ "II", "III" ] }
{ "_id" : "3", "name_ecg" : "test3", "channel" : [ "MLI", "MLII", "V5" ] }
{ "_id" : "4", "name_ecg" : "test4", "channel" : [ "I" ] }
{ "_id" : "5", "name_ecg" : "test5", "channel" : [ "II" ] }

exportingRegion

{ "_id" : "1", "name_exp_region" : "exp_reg1", "record_set_id" : "1", "ecg_id" : "1" }
{ "_id" : "2", "name_exp_region" : "exp_reg2", "record_set_id" : "1", "ecg_id" : "1" }
{ "_id" : "3", "name_exp_region" : "exp_reg3", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "4", "name_exp_region" : "exp_reg4", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "5", "name_exp_region" : "exp_reg5", "record_set_id" : "1", "ecg_id" : "2" }
{ "_id" : "6", "name_exp_region" : "exp_reg6", "record_set_id" : "1", "ecg_id" : "3" }
{ "_id" : "7", "name_exp_region" : "exp_reg7", "record_set_id" : "2", "ecg_id" : "1" }
{ "_id" : "8", "name_exp_region" : "exp_reg8", "record_set_id" : "2", "ecg_id" : "1" }
{ "_id" : "9", "name_exp_region" : "exp_reg9", "record_set_id" : "2", "ecg_id" : "1" }

这是我的查询:

db.recordSet.aggregate(
[
{
'$match': {
'_id': 1
}
}, {
'$lookup': {
'from': 'ecg', 
'localField': 'source', 
'foreignField': '_id', 
'as': 'ecg'
}
}, {
'$unwind': {
'path': '$ecg', 
'preserveNullAndEmptyArrays': True
}
}, {
'$lookup': {
'from': 'exportingRegion', 
'localField': 'ecg._id', 
'foreignField': 'ecg_id', 
'as': 'ecg.exportingRegion'
}
}, {
'$lookup': {
'from': 'exportingRegion', 
'localField': 'record_set_id', 
'foreignField': '_id', 
'as': 'record_set.exportingRegion'
}
}, {
'$group': {
'_id': '$_id', 
'ecg': {
'$push': {
'ecg': '$ecg', 
'exporting_region': '$exportingRegion'
}
}
}
}
]
)

:

{
"_id": "1",
"ecg": [
{
"_id": "1",
"name_ecg": "test1",
"channel": [
"I",
"II",
"III"
],
"exportingRegion": [
{
"_id": "1",
"name_exp_region": "exp_reg1"
},
{
"_id": "2",
"name_exp_region": "exp_reg2"
}
]
},
{
"_id": "2",
"name_ecg": "test2",
"channel": [
"II",
"III"
],
"exportingRegion": [
{
"_id": "3",
"name_exp_region": "exp_reg3"
},
{
"_id": "4",
"name_exp_region": "exp_reg4"
},
{
"_id": "5",
"name_exp_region": "exp_reg5"
}
]
},
{
"_id": "3",
"name_ecg": "test3",
"channel": [
"MLI",
"MLII",
"V5"
],
"exportingRegion": [
{
"_id": "6",
"name_exp_region": "exp_reg6"
}
]
}
]
}

一种选择是使用$lookup管道来执行您的限制:

db.recordSet.aggregate([
{$match: {_id: "1"}},
{$lookup: {
from: "ecg",
localField: "source",
foreignField: "_id",
as: "ecg"
}
},
{$unwind: {path: "$ecg", preserveNullAndEmptyArrays: true}},
{$lookup: {
from: "exportingRegion",
let: {recordId: "$_id", ecgId: "$ecg._id"},
pipeline: [
{$match: {
$expr: {
$and: [
{$eq: ["$ecg_id", "$$ecgId"]},
{$eq: ["$record_set_id", "$$recordId"]}
]
}
}
}
],
as: "exportingRegion"
}
},
{$group: {
_id: "$_id",
ecg: {$push: {ecg: "$ecg", exporting_region: "$exportingRegion"}}
}
}
])

看看它在操场的例子中是如何工作的

相关内容

  • 没有找到相关文章

最新更新