MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb :connectToField calculé dans graphlookup

connectToField est un nom, pas une expression. Vous ne pouvez rien faire avec.

Il faut vraiment revoir le schéma. Il est défectueux à bien des égards, à commencer par les noms non uniques utilisés dans les références parentes. Puisque vous comptez sur la chaîne de chemin à la place , vous avez besoin d'un chemin pour référencer le parent.

La réponse ci-dessous fonctionne pendant l'exécution et n'est guère recommandée pour les requêtes opérationnelles en raison de l'inefficacité des performances et quelques hypothèses sur la façon dont le chemin est construit. Il peut cependant être utilisé comme une demande unique.

Fondamentalement, vous devez créer une vue avec chemin parent calculé :

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" ] }
            } }
        } }
    } }
]);

Vous pouvez donc effectuer votre recherche comme indiqué dans votre question précédente :

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