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

Mongodb:beregnet connectToField inde i graphlookup

connectToField er et navn, ikke et udtryk. Du kan ikke gøre noget ved det.

Du er virkelig nødt til at genoverveje skemaet. Det er mangelfuldt på mange måder, startende fra ikke-unikke navne, der bruges i overordnede referencer. Da du i stedet stoler på stistrengen , skal du bruge en sti til at henvise til forælderen.

Svaret nedenfor gør det runtime og er næppe tilrådeligt til operationelle forespørgsler på grund af ineffektivitet og nogle antagelser om, hvordan stien er bygget. Det kan dog bruges som en engangsanmodning.

Grundlæggende skal du oprette en visning med beregnet overordnet sti:

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

Så kan du foretage dit opslag som anbefalet i dit tidligere spørgsmål:

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



  1. Sådan fjerner du et element fra et dobbelt indlejret array i et MongoDB-dokument.

  2. Opdatering af et dokumentfelt i mongo baseret på et andet felts værdi

  3. Lav dynamisk forespørgsel med Mongoose

  4. HDFS Tutorial – En komplet introduktion til HDFS for begyndere