【发布时间】:2021-07-07 23:41:40
【问题描述】:
我的目标是根据我输入的对象的根名称返回一个完全链接的对象,同时过滤“子子对象”。
所以给出下面的示例架构:
1.根对象集合
[ { "_id": ObjectId("AAA1"), "name": "rootObj1", "subObjects": [ ObjectId("BBB1"), ObjectId("BBB2") ] }, { "_id": ObjectId("AAA2"), "name": "rootObj2", "subObjects": [] } ]
2。子对象集合
[ { "_id": ObjectId("BBB1"), "name": "subObjectName1", "subSubObjects": [ ObjectId("CCC1"), ObjectId("CCC2") ] }, { "_id": ObjectId("BBB2"), "name": "subObjectName2", "subSubObjects": [ ObjectId("CCC2") ] } ]
3.子子对象集合
[ { "_id": ObjectId("CCC1"), "name": "nameToFind" }, { "_id": ObjectId("CCC2"), "name": "someOtherName" } ]
如果我传入我想要“rootObj1”并且我只想要名称为“nameToFind”的子子对象(或类似于下面的内容,我不在乎是否_id 仍然在对象中,只是事物链接在一起的想法)
目标结果
{ "name": "rootObj1", "subObjects": [ { "name": "subObjectName1", "subSubObjects": [ {"name": "nameToFind"} ] }, { "name": "subObjectName2", "subSubObjects": [] } ] }
我发现很多有用的帖子展示了 $lookup、$unwind、$lookup(使用管道功能),然后使用组/项目或其他东西来组装它。虽然我可以使用查找来查找值,但我最终会得到类似下面的内容并且无法组装它。
所以我试图运行这样的东西:
rootCollection.aggregate([
{ "$match": {
"name" : "rootObject1",
}},
{ "$lookup": {
"from": "subObject",
"localField": "subObjects",
"foreignField": "_id",
"as": "subObjects"
}
},
{ "$lookup": {
"from": "subSubObjects",
"localField": "subObjects.subSubObjects",
"foreignField": "_id",
"as": "subSubObjects"
}
},
])
最终结果如下所示,但我真的不明白如何过滤 subSubObjects,然后以某种方式将它们重新合并到一个结构中。
[ { "_id": {"$oid": "AAA1"}, "name": "rootObject1", "subObjects": [ {"$oid": "BBB1")}, {"$oid": "BBB2")} ] }, "subObjects": [ { "_id": {"$oid": "BBB1"}, "name": "subObjectName1", "subSubObjects": [ {"$oid": "CCC1")}, {"$oid": "CCC2")}) ] }, { "_id": {"$oid": "BBB2"}, "name": "subObjectName2", "subSubObjects": [ {"$oid": "CCC1")}, {"$oid": "CCC2")}) ] }, ], "subSubObjects": [ { "_id": {"$oid": "CCC1"}, "name": "nameToFind", }, { "_id": {"$oid": "CCC2"}, "name": "someOtherName", }, ] ]
【问题讨论】:
-
这能回答你的问题吗? MongoDB nested lookup with 3 levels
-
那种?这绝对有帮助。我觉得我需要滥用组运算符,因为我将“_id”设置为 {“rootObject”:{“subObjects”:“$subObjects”}} 等。让所有收集。因为我并不是真的想把任何事情总结在一起。我主要担心的是,随着我的真实数据结构的复杂性增加,这将变得难以管理。
-
我剩下的主要问题是,当我深入到子子对象时,我将如何进行过滤,因为 $group 或 $lookup 都没有过滤。
-
从重复的问题中查看这个answer,并查看您的问题的工作playground,当您使用管道查找时,不需要$group 阶段。
-
我不知道您可以像这样在管道字段中进行查找。我试图连续进行一堆查找,然后稍后神奇地对它们进行分组。
标签: mongodb mongodb-query aggregation-framework