Vanaf MongoDB 3.4 kunnen we dit doen met het Aggregation Framework.
De eerste en belangrijkste fase in onze pijplijn is de $graphLookup
fase. $graphLookup
stelt ons in staat recursief te matchen op het "ouder" en "naam" veld. Als resultaat krijgen we de voorouders van elke "naam".
De volgende fase in de pijplijn is de $match
fase waarin we eenvoudig de "naam" selecteren waarin we geïnteresseerd zijn.
De laatste fase is de $addFields
of $project
fase waarin we een uitdrukking toepassen op de array "ancestors" met behulp van de $map
array-operator.
Natuurlijk met de $reverseArray
operator we draaien onze array om
om het verwachte resultaat te krijgen.
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" }
}
}
}
}}
]
)