具有来自对象数组

时间:2016-11-15 11:53:11

标签: mongodb mongodb-aggregation

这个问题以前被标记为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查询来过滤数据,但这不是我的问题的一部分。

1 个答案:

答案 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" }
            }
        }
        ])