Fra MongoDB 3.4 kan vi gøre dette med Aggregation Framework.
Den første og vigtigste fase i vores pipeline er $graphLookup
scene. $graphLookup
giver os mulighed for rekursivt at matche i feltet "forælder" og "navn". Som et resultat får vi forfædrene til hvert "navn".
Næste trin i pipelinen er $match
trin, hvor vi blot vælger det "navn", vi er interesseret i.
Den sidste fase er $addFields
eller $project
trin, hvor vi anvender et udtryk på "forfædre"-arrayet ved hjælp af $map
array-operator.
Selvfølgelig med $reverseArray
operatør, vi vender vores array
for at få det forventede resultat.
db.collection.aggregate(
[
{ "$graphLookup": {
"from": "collection",
"startWith": "$parent",
"connectFromField": "parent",
"connectToField": "name",
"as": "ancestors"
}},
{ "$match": { "name": "D" } },
{ "$addFields": {
"ancestors": {
"$reverseArray": {
"$map": {
"input": "$ancestors",
"as": "t",
"in": { "name": "$$t.name" }
}
}
}
}}
]
)