Solución:
$ graphLookup no produce la jerarquía de dependencias; realiza una búsqueda recursiva de documentos conectados, pero los resultados se compactan en la matriz de una sola dimensión. Aquí está la cita de la documentación:
Para cada documento coincidente, $ graphLookup toma el valor de la
_identificación y comprueba todos los documentos del árbol colección para un emparejamiento padre valor. Para cada coincidencia, $ graphLookup agrega el documento coincidente en la colección from a una matriz niños. Este paso continúa de forma recursiva hasta que no se encuentran más documentos coincidentes o hasta que la operación alcanza una profundidad de recursividad especificada por el parámetro maxDepth.
Es decir, busca documentos dependientes de forma recursiva, pero cada documento encontrado se agrega a la misma matriz secundaria del documento principal, sin importar qué tan “profundo” se encuentre el secundario.
Nota: no ves Child 1.1
con su conectado Subchild 1.1.1
porque está filtrando estos documentos en match
escenario:
{ $match: { parent: { $exists: false } } }
que selecciona solo documentos que no tienen un padre – "Root node 1"
y "Root node 2"
. Si elimina este filtro, se devolverán todos los demás documentos con la jerarquía de sus dependientes:
{
"name" : "Child 1.1",
"children" : [
{ "name" : "Subchild 1.1.1" }
]
},
{
"name" : "Child 1.2"
"children" : []
},
{
"name" : "Root node 1",
"children" : [
{ "name" : "Subchild 1.1.1" },
{ "name" : "Child 1.2" },
{ "name" : "Child 1.1" }
]
},
{
"name" : "Root node 2",
"children" : []
},
{
"name" : "Subchild 1.1.1"
"children" : []
}
Si no desea mezclar niños de diferentes ‘profundidades’ de árbol en una matriz de niños individuales, eche un vistazo al comentario interesante en la documentación
Establecer el campo maxDepth en 0 es equivalente a una etapa de búsqueda $ lookup no recursiva.
Significa que cada documento obtendrá todos sus hijos directos en la matriz de hijos, y después de esa búsqueda se detendrá sin más búsquedas recursivas. La salida será
{
"name" : "Child 1.1",
"children" : [
{ "name" : "Subchild 1.1.1" }
]
},
{
"name" : "Child 1.2"
"children" : []
},
{
"name" : "Root node 1",
"children" : [
{ "name" : "Child 1.2" },
{ "name" : "Child 1.1" }
]
},
{
"name" : "Root node 2",
"children" : []
},
{
"name" : "Subchild 1.1.1"
"children" : []
}