2016-11-15 100 views
0

此问题以前被标记为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查询到管道来过滤数据,但这不是我的问题的真正组成部分。

+1

只是为了澄清,我将其标记为重复的,因为在重复数据删除的答案仍然适用于你的问题;您需要应用'$ unwind'管道来压扁嵌入文档数组,以便在“attendees.contact”字段应用'$ lookup'运算符,然后在'$ lookup'之后应用另一个'$ unwind'和'$ group'生成的文档可以得到你想要的结果。另一个答案也适用于使用即将推出的MongoDB 3.4 – chridam

+0

好的,所以你要说的是我应该首先'{“$ unwind”:“$ attendees”}',然后'{“$ lookup”:{“从“:”联系人“,”localField“:”attendees.contact“,”foreignField“:”_id“,”as“:”contactlist“}}',然后'{”$ unwind“:”$ contactlist“}'然后'$ group'? –

+0

正确。调试管道的提示;在每个管道阶段运行聚合查询,测试每个步骤的结果是否合理。例如,在上面的聚合中,首先运行'db.event.aggregate([{“$ unwind”:“$ attendees”}]);',检查结果是否正确解构了参加者数组,下一个管道阶段'db.event.aggregate([{“$ unwind”:“$ attendees”},{“$ lookup”:{“from”:“Contact”,“localField”:“attendees.contact”,“foreignField “:”_id“,”as“:”contactlist“}}]);',运行该程序并重复这些步骤,直到您进入最后的管道步骤。 – chridam

回答

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" } 
      } 
     } 
     ]) 
+0

此查询返回所需的输出,但“参与者”数组中返回的文档没有字段(contact,type,...缺失)。你知道什么可能会导致这种情况吗? –

+0

你能告诉我你用这个查询得到了什么吗? –