A partire da MongoDB 3.4, possiamo farlo con Aggregation Framework.
La prima e più importante fase della nostra pipeline è il $graphLookup
palcoscenico. $graphLookup
ci consente di abbinare ricorsivamente il campo "genitore" e "nome". Di conseguenza, otteniamo gli antenati di ogni "nome".
La fase successiva della pipeline è il $match
fase in cui selezioniamo semplicemente il "nome" che ci interessa.
La fase finale è il $addFields
o $project
fase in cui applichiamo un'espressione all'array "ancestors" utilizzando $map
operatore di array.
Ovviamente con $reverseArray
operatore invertiamo il nostro array
per ottenere il risultato atteso.
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" }
}
}
}
}}
]
)