Según su caso de uso, MongoDB v3.4 proporciona una canalización de agregación operador llamado $graphLookup . El operador de agregación puede realizar una búsqueda recursiva en una colección. Ver más definición en $graphLookup definición .
Usando la jerarquía de documentos y los valores anteriores como ejemplos, podría intentar ejecutar debajo de la agregación:
db.collectionName.aggregate([
{$unwind:{
path:"$childrenIdList",
preserveNullAndEmptyArrays: true}
},
{$graphLookup:{
from:"collectionName",
startWith:"$_id",
connectFromField:"_id",
connectToField:"childrenIdList",
as:"myparents",
restrictSearchWithMatch: {"_id"}}
},
{$match: {"_id": 7 } },
{$group:{
_id:"$_id",
parents:{$addToSet:"$myparents._id"}
}}
]);
Lo anterior debería devolver el resultado de la siguiente manera:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Habiendo dicho eso, si tiene una gran colección, es posible que la consulta anterior no funcione, ya que estará realizando $desenrollar en cada documento y no podrá utilizar índices. Como lo sugirieron otros, debe reconsiderar la estructura de su modelo de documento. Consulte Estructuras de árbol de modelos de datos . Optimice en función de la lógica de su aplicación y el caso de uso de consulta, y deje que siga el esquema de documento flexible.