A partir do MongoDB 3.4, podemos fazer isso com o Aggregation Framework.
O primeiro e mais importante estágio do nosso pipeline é o
$graphLookup
palco. $graphLookup
nos permite combinar recursivamente no campo "pai" e "nome". Como resultado, obtemos os ancestrais de cada "nome". O próximo estágio no pipeline é o
$match
etapa em que simplesmente selecionamos o "nome" que nos interessa. O estágio final é o
$addFields
ou $project
estágio em que aplicamos uma expressão ao array "ancestors" usando o $map
operador de matriz. Claro que com o
$reverseArray
operador nós invertemos nossa matriz
para obter o resultado esperado. 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" }
}
}
}
}}
]
)