sql >> Databáze >  >> NoSQL >> MongoDB

Mongodb:vypočítané connectToField uvnitř graphlookup

connectToField je jméno, ne výraz. S tím nemůžete nic dělat.

Opravdu musíte znovu zvážit schéma. Je v mnoha ohledech chybný, počínaje nejedinečnými jmény používanými v nadřazených odkazech. Protože místo toho spoléháte na řetězec cesty , potřebujete cestu k odkazu na rodiče.

Níže uvedená odpověď se týká běhu a je stěží vhodná pro provozní dotazy kvůli neefektivitě výkonu a některé předpoklady, jak je cesta postavena. Lze jej však použít jako jednorázový požadavek.

V zásadě musíte vytvořit zobrazení s vypočítanou nadřazenou cestou:

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

Pak můžete provést vyhledávání podle pokynů v předchozí otázce:

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



  1. Jak potlačit sloupec v mongodb pomocí ovladačů Java?

  2. Omezit agregaci ve seskupené agregaci

  3. Proč mongoose používá schéma, když výhoda mongodb má spočívat v tom, že je bez schématu?

  4. Pokud klíč neexistuje Mongoose, vložte hodnotu do pole