2016-11-15 103 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

你能告訴我你用這個查詢得到了什麼嗎? –