这个问题以前被标记为this question的副本我可以肯定地确认它不是。
这不是链接问题的副本,因为所讨论的元素不是数组,而是作为字段嵌入到数组的各个对象中。我完全了解链接问题中的查询应该如何工作,但是这种情况与我的不同。
我对MongoDb的$lookup
查询有疑问。我的数据结构如下:
我的“Event”集合包含以下单个文档:
{
"_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
}
我想要做的是在“Event”集合中使用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
}
}
]
}
我对另一个文档中引用的“Contact”的单个元素做了同样的事情,但从未嵌入到数组中。我不确定要通过哪个管道参数来获得上面显示的结果?
我还想在管道中添加$match
查询来过滤数据,但这不是我的问题的一部分。
答案 0 :(得分:0)
试试这个
db.getCollection('Event').aggregate([{ "$unwind": "$attendees" },
{ "$lookup" : { "from" : "Contact", "localField" : "attendees.contact", "foreignField": "_id", "as" : "contactlist" } },
{ "$unwind": "$contactlist" },
{ "$project" :{
"attendees.type" : 1,
"attendees.status" : 1,
"attendees.contact" : "$contactlist",
"name": 1, "_id": 1
}
},
{
"$group" : {
_id : "$_id" ,
"name" : { $first : "$name" },
"attendees" : { $push : "$attendees" }
}
}
])