我正在嘗試使用新的MongoDB v3.4 $ graphLookup聚合管道。我有這個簡單的樹集合,一些節點和父DBREF:
{ "_id" : ObjectId("59380657bbdbfb36c18a80f2"), "name" : "Root node 1" },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f5"), "name" : "Child 1.1", "parent" : ObjectId("59380657bbdbfb36c18a80f2") },
{ "_id" : ObjectId("593806b0bbdbfb36c18a80f7"), "name" : "Subchild 1.1.1", "parent" : ObjectId("5938068abbdbfb36c18a80f5") },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f6"), "name" : "Child 1.2", "parent" : ObjectId("59380657bbdbfb36c18a80f2") },
{ "_id" : ObjectId("59380657bbdbfb36c18a80f3"), "name" : "Root node 2" }
我想獲得這種樹狀結構的:
- Root node 1
- Child 1.1
- Subchild 1.1.1
- Child 1.2
- Root node 2
所以,我試圖與工作新的$ graphLookup聚合管道,就像這樣:
db.getCollection('tree').aggregate([
{ $match: { parent: { $exists: false } } },
{
$graphLookup: {
from: "tree",
startWith: "$_id",
connectFromField: "_id",
connectToField: "parent",
as: "children"
}
},
{ $sort: { name: 1 } }
])
但我的問題是,我得到「根節點1」所有的孩子在一個收集:
{
"_id" : ObjectId("59380657bbdbfb36c18a80f2"),
"name" : "Root node 1",
"children" : [
{ "_id" : ObjectId("593806b0bbdbfb36c18a80f7"), "name" : "Subchild 1.1.1", "parent" : ObjectId("5938068abbdbfb36c18a80f5") },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f6"), "name" : "Child 1.2", "parent" : ObjectId("59380657bbdbfb36c18a80f2") },
{ "_id" : ObjectId("5938068abbdbfb36c18a80f5"), "name" : "Child 1.1", "parent" : ObjectId("59380657bbdbfb36c18a80f2") }
]
},
{
"_id" : ObjectId("59380657bbdbfb36c18a80f3"),
"name" : "Root node 2",
"children" : [ ]
}
我不知道如何查找兒童遞歸獲得「兒童1.1」兒童集合中的「Subchild 1.1.1」。 我正在尋找任何建議。謝謝:)
感謝您的非常完整的答案!你的解釋更加清楚:「它執行連接文檔的遞歸搜索,但結果被壓縮到單維數組中」。 所以基本上,$ graphLookup無法處理依賴關係的層次結構。如果我需要計算一個完整的樹結構,它不是適合的工具。我可以重新計算你在評論中提到的結果(沒有$匹配)或尋找另一個解決方案:) –
@JeremyBarthe我添加了小的更新(關於maxDepth參數)。看起來這更接近你想達到的目標。至少不同級別的孩子不會混淆。 –
感謝您的幫助! maxDepth在樹結構中絕對是一件有趣的事情。我認爲結論是我無法計算整個樹(我的意思是嵌套層次),但無論如何$ lookup和$ graphLookup是非常好的特性(它們在MongoDB中顯然缺少)。 –