sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb:beräknad connectToField inuti graphlookup

connectToField är ett namn, inte ett uttryck. Du kan inte göra något med det.

Du måste verkligen ompröva schemat. Det är bristfälligt på många sätt med början från icke-unika namn som används i överordnade referenser. Eftersom du förlitar dig på sökvägssträngen istället , behöver du en sökväg för att referera till föräldern.

Svaret nedan är körtid och är knappast att rekommendera för operativa frågor på grund av prestandaineffektivitet och några antaganden om hur stigen är byggd. Det kan dock användas som en engångsförfrågan.

I grund och botten måste du skapa en vy med beräknad överordnad sökväg:

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å då kan du göra din sökning som rekommenderas i din tidigare fråga:

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



  1. I NodeJS, hur matar man ut resultat från mongodb med olika fältnamn?

  2. Filtrera bort dubbletter av arrayer och returnera den unika arrayen i mongodb-aggregation

  3. MongoDB-kommandon från DOS eller Windows

  4. $project i $lookup-aggregation