sql >> Database >  >> NoSQL >> MongoDB

Mongodb:berekend connectToField binnen graphlookup

connectToField is een naam, geen uitdrukking. Je kunt er niets mee.

Je moet het schema echt opnieuw bekijken. Het is in veel opzichten gebrekkig, te beginnen met niet-unieke namen die worden gebruikt in bovenliggende verwijzingen. Aangezien u in plaats daarvan vertrouwt op de padtekenreeks , hebt u een pad nodig om naar de ouder te verwijzen.

Het onderstaande antwoord doet het runtime, en is nauwelijks aan te raden voor operationele vragen vanwege inefficiëntie van de prestaties en enkele aannames over hoe het pad is gebouwd. Het kan echter wel als een eenmalig verzoek worden gebruikt.

In principe moet je een weergave maken met berekend ouderpad:

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

Dus dan kunt u uw zoekopdracht uitvoeren zoals geadviseerd in uw vorige vraag:

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



  1. Hoe {document}.Id wordt niet ondersteund fout op te lossen

  2. MongoDB $dateToString

  3. Hiërarchische structuur Firestore en subcollecties

  4. MongoDB:Bereken de verblijfstijd tussen elke wijziging van de statuswaarde