MongoDB嵌套查找,最后级别具有3个级别和2个外键
我有3个集合,即RecordSet
,ecg
和导出区
。第一级具有source
的第二级外键。当我与其他主题检查时,第三级只有1个外键,其中第二级。
但是,在这种情况下,我有2个外国键,它们连接到第一和第二级。
在查询最后一个级别时,我想添加更多约束,但我认为它不起作用。您能帮我检查查询吗?任何评论都非常感谢。
下面是我的3个收藏夹,其中包含数据样本。
记录集
{ "_id" : "1", "name" : "recordSet1", "source" : [1, 2, 3] }
{ "_id" : "2", "name" : "recordSet2", "source" : [1, 4, 5] }
ecg
{ "_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" ] }
导出区
{ "_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"
}
]
}
]
}
I have 3 collections namely recordSet
, ecg
, and exportingRegion
. The 1st level has a foreign key with the 2nd level by source
. As I checked with other topics, the 3rd level has only 1 foreign key with the 2nd level.
However, in this case, I have 2 foreign keys, which connect to the 1st and 2nd levels.
I would like to add more constraints when querying the last level, but I think it does not work. Can you help me check the query? any comment is highly appreciated.
Below here is my 3 collections with the data sample.
recordSet
{ "_id" : "1", "name" : "recordSet1", "source" : [1, 2, 3] }
{ "_id" : "2", "name" : "recordSet2", "source" : [1, 4, 5] }
ecg
{ "_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" }
Here is my query:
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'
}
}
}
}
]
)
Expectation:
{
"_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"
}
]
}
]
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一个选项是使用
$查找
管道来执行您的限制:请参阅游乐场示例
One option is using the
$lookup
pipeline to enforce your limitations:See how it works on the playground example