Por ejemplo, una estructura de árbol como;
[ {id: 1 , childrenIdList: [2, 3]}, {id: 2 , childrenIdList: [4, 5]}, {id: 3 , childrenIdList: []}, {id: 4 , childrenIdList: [6, 7]}, {id: 5 , childrenIdList: []}, {id: 6 , childrenIdList: []}, {id: 7 , childrenIdList: []} ]que es como;
1 2 3 4 5 6 7¿Cómo puedo rastrear el árbol desde el inicio del nodo hoja (id = 7) hasta la raíz (id = 1)?
Encontrar el padre de id=7 es tan fácil como;
db.document.find({childrenList: { $in: [7]}}, {id: 1}).toArray(function(err), result{ /*result gives {"id" : NumberInt(4)} now I should look the parent of id=4, and parent of id=2 as you know. */ })¿Son posibles las consultas recursivas en mongodb? ¿Cómo puedo implementarlo?
Según su caso de uso, MongoDB v3.4 proporciona un operador de canalización de agregación denominado $graphLookup . El operador de agregación puede realizar una búsqueda recursiva en una colección. Ver más definición en la definición de $graphLookup .
Usando la jerarquía de sus 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 realizará $unwind 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.