此問題以前被標記爲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