MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb:berechnetes connectToField innerhalb von graphlookup

connectToField ist ein Name, kein Ausdruck. Damit kannst du nichts anfangen.

Sie müssen das Schema wirklich überdenken. Es ist in vielerlei Hinsicht fehlerhaft, beginnend mit nicht eindeutigen Namen, die in übergeordneten Referenzen verwendet werden. Da verlassen Sie sich auf die Pfadzeichenfolge statt , benötigen Sie einen Pfad, um auf das übergeordnete Element zu verweisen.

Die folgende Antwort funktioniert zur Laufzeit und ist für operative Abfragen aufgrund von Leistungsineffizienzen kaum zu empfehlen und einige Annahmen darüber, wie der Pfad aufgebaut ist. Es kann jedoch als einmalige Anfrage verwendet werden.

Grundsätzlich müssen Sie eine Ansicht erstellen mit berechnetem Elternpfad:

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

Dann können Sie Ihre Suche wie in Ihrer vorherigen Frage empfohlen durchführen:

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