À partir de MongoDB 3.4, nous pouvons le faire avec le cadre d'agrégation.
La première et la plus importante étape de notre pipeline est le $graphLookup
organiser. $graphLookup
nous permet de faire correspondre de manière récursive les champs "parent" et "name". En conséquence, nous obtenons les ancêtres de chaque "nom".
La prochaine étape du pipeline est le $match
étape où nous sélectionnons simplement le "nom" qui nous intéresse.
La dernière étape est le $addFields
ou $project
étape où nous appliquons une expression au tableau "ancestors" en utilisant le $map
opérateur de tableau.
Bien sûr avec le $reverseArray
opérateur nous inversons notre tableau
afin d'obtenir le résultat escompté.
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" }
}
}
}
}}
]
)