MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongodb:ConnectToField calcolato all'interno di graphlookup

connectToField è un nome, non un'espressione. Non puoi farci niente.

Hai davvero bisogno di riconsiderare lo schema. È imperfetto in molti modi a partire da nomi non univoci usati nei riferimenti genitore. Poiché ti affidi invece alla stringa del percorso , è necessario un percorso per fare riferimento al genitore.

La risposta seguente è runtime ed è difficilmente consigliabile per query operative a causa dell'inefficienza delle prestazioni e alcune ipotesi su come è costruito il percorso. Tuttavia, può essere utilizzato come richiesta una tantum.

Fondamentalmente devi creare una vista con percorso padre calcolato:

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

Quindi puoi fare la tua ricerca come consigliato nella tua domanda precedente:

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