此问题以前被标记为this question的副本我可以肯定地确认它不是。
这不是链接问题的副本,因为所讨论的元素不是数组,而是嵌入数组的单个对象中作为字段。我完全意识到链接问题中的查询应该如何工作,但是这种情况与我的不同。
我有一个关于MongoDb的$lookup
查询的问题。我的数据结构如下所示:
我“事件”集合包含此单个文件:
{
"_id": ObjectId("mongodbobjectid..."),
"name": "Some Event",
"attendees": [
{
"type": 1,
"status": 2,
"contact": ObjectId("mongodbobjectidHEX1")
},
{
"type": 7,
"status": 4,
"contact": ObjectId("mongodbobjectidHEX2")
}
]
}
我“联系”集合包含这些文件:
{
"_id": ObjectId("mongodbobjectidHEX1"),
"name": "John Doe",
"age": 35
},
{
"_id": ObjectId("mongodbobjectidHEX2"),
"name": "Peter Pan",
"age": 60
}
我想要做的是执行aggregate
查询与$lookup
运营商在“事件”收集和得到以下结果全“接触”的数据:
{
"_id": ObjectId("mongodbobjectid..."),
"name": "Some Event",
"attendees": [
{
"type": 1,
"status": 2,
"contact": {
"_id": ObjectId("mongodbobjectidHEX1"),
"name": "John Doe",
"age": 35
}
},
{
"type": 7,
"status": 4,
"contact": {
"_id": ObjectId("mongodbobjectidHEX2"),
"name": "Peter Pan",
"age": 60
}
}
]
}
我做了以“联系”在另一个文件中引用,但从来没有当嵌入在一个阵列的单一稀土元素相同。我是不确定哪个管道参数要通过才能得到上面显示的结果?
我也想添加一个$match
查询到管道来过滤数据,但这不是我的问题的真正组成部分。
只是为了澄清,我将其标记为重复的,因为在重复数据删除的答案仍然适用于你的问题;您需要应用'$ unwind'管道来压扁嵌入文档数组,以便在“attendees.contact”字段应用'$ lookup'运算符,然后在'$ lookup'之后应用另一个'$ unwind'和'$ group'生成的文档可以得到你想要的结果。另一个答案也适用于使用即将推出的MongoDB 3.4 – chridam
好的,所以你要说的是我应该首先'{“$ unwind”:“$ attendees”}',然后'{“$ lookup”:{“从“:”联系人“,”localField“:”attendees.contact“,”foreignField“:”_id“,”as“:”contactlist“}}',然后'{”$ unwind“:”$ contactlist“}'然后'$ group'? –
正确。调试管道的提示;在每个管道阶段运行聚合查询,测试每个步骤的结果是否合理。例如,在上面的聚合中,首先运行'db.event.aggregate([{“$ unwind”:“$ attendees”}]);',检查结果是否正确解构了参加者数组,下一个管道阶段'db.event.aggregate([{“$ unwind”:“$ attendees”},{“$ lookup”:{“from”:“Contact”,“localField”:“attendees.contact”,“foreignField “:”_id“,”as“:”contactlist“}}]);',运行该程序并重复这些步骤,直到您进入最后的管道步骤。 – chridam