sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb:connectToField calculado dentro de graphlookup

connectToField es un nombre, no una expresión. No puedes hacer nada con eso.

Realmente necesita reconsiderar el esquema. Tiene fallas de muchas maneras, a partir de nombres no únicos utilizados en las referencias de los padres. Dado que confía en la cadena de ruta en su lugar , necesita una ruta para hacer referencia al padre.

La respuesta a continuación es de tiempo de ejecución y no es recomendable para consultas operativas debido a la ineficiencia del rendimiento y algunos supuestos de cómo se construye el camino. Sin embargo, se puede utilizar como una solicitud única.

Básicamente, debe crear una vista con ruta principal calculada:

db.createView("rootless_tree", "tree", [
    { $match: { parent: { $ne: null } } },
    { $addFields: {
        parent_path: { $let: {
            vars: { parents: { $split: [ "$path", "#" ] } },
            in: { $reduce: {
                input: { $slice: [ "$$parents", 1, { $subtract: [ { $size: "$$parents" }, 2 ] } ] },
                initialValue: "",
                in: { $concat: [ "$$value", "#", "$$this" ] }
            } }
        } }
    } }
]);

Entonces puede hacer su búsqueda como se indica en su pregunta anterior:

db.tree.aggregate([
    { $graphLookup: {
        from: "rootless_tree", 
        startWith: "$path", 
        connectFromField: "path", 
        connectToField: "parent_path", 
        as:"dep"
    } },
    { $match: { dep: [] } },                       
])