Ab MongoDB 3.4 können wir dies mit dem Aggregation Framework tun.
Die erste und wichtigste Phase in unserer Pipeline ist $graphLookup
Bühne. $graphLookup
ermöglicht es uns, rekursiv die Felder „parent“ und „name“ abzugleichen. Als Ergebnis erhalten wir die Vorfahren jedes "Namens".
Die nächste Stufe in der Pipeline ist $match
Phase, in der wir einfach den "Namen" auswählen, an dem wir interessiert sind.
Die letzte Stufe ist der $addFields
oder $project
Phase, in der wir mithilfe von $map
Array-Operator.
Natürlich mit dem $reverseArray
Operator umkehren unser Array
um das erwartete Ergebnis zu erhalten.
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" }
}
}
}
}}
]
)