我有三个集合,分别是recordSet
,ecg
和exportingRegion
。第一级有一个外键,第二级是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"}}
}
}
])
看看它在操场的例子中是如何工作的