Począwszy od MongoDB 3.4, możemy to zrobić za pomocą agregacji Framework.
Pierwszym i najważniejszym etapem naszego potoku jest $graphLookup
etap. $graphLookup
pozwala nam na rekurencyjne dopasowanie w polu „rodzic” i „nazwa”. W rezultacie otrzymujemy przodków każdego „imiona”.
Następnym etapem w potoku jest $match
etap, w którym po prostu wybieramy „nazwę”, która nas interesuje.
Ostatnim etapem jest $addFields
lub $project
etap, w którym stosujemy wyrażenie do tablicy „ancestors” za pomocą $map
operator tablicowy.
Oczywiście z $reverseArray
operator odwracamy naszą tablicę
w celu uzyskania oczekiwanego rezultatu.
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" }
}
}
}
}}
]
)