Med utgångspunkt från MongoDB 3.4 kan vi göra detta med Aggregation Framework.
Det första och viktigaste steget i vår pipeline är $graphLookup
skede. $graphLookup
tillåter oss att rekursivt matcha i fälten "förälder" och "namn". Som ett resultat får vi förfäderna till varje "namn".
Nästa steg i pipelinen är $match
steg där vi helt enkelt väljer det "namn" vi är intresserade av.
Det sista steget är $addFields
eller $project
steg där vi applicerar ett uttryck på arrayen "förfäder" med hjälp av $map
array-operator.
Naturligtvis med $reverseArray
operatör vi vänder om vår array
för att få det förväntade resultatet.
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" }
}
}
}
}}
]
)