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: [] } },
])