Saltar al contenido

$ GraphLookup de MongoDB tratando de obtener una estructura de árbol

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" : []
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *