A partir de MongoDB 3.4, podemos hacer esto con Aggregation Framework.
La primera y más importante etapa en nuestra tubería es el $graphLookup
escenario. $graphLookup
nos permite hacer coincidir recursivamente el campo "padre" y "nombre". Como resultado, obtenemos los antepasados de cada "nombre".
La siguiente etapa en la canalización es $match
etapa donde simplemente seleccionamos el "nombre" que nos interesa.
La etapa final es $addFields
o $project
etapa donde aplicamos una expresión a la matriz "antepasados" usando el $map
operador de matriz.
Por supuesto, con $reverseArray
operador nosotros invertir nuestra matriz
para obtener el 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" }
}
}
}
}}
]
)