connectToField
е име, а не израз. Не можете да направите нищо с него.
Наистина трябва да преосмислите схемата. Има недостатъци по много начини, като се започне от неуникални имена, използвани в родителските препратки. Тъй като вместо това разчитате на низа на пътя , имате нужда от път за препратка към родителя.
Отговорът по-долу го прави по време на изпълнение и едва ли е препоръчителен за оперативни заявки поради неефективност на производителността и някои предположения за това как е построен пътят. Въпреки това може да се използва като еднократна заявка.
По принцип трябва да създадете изглед с изчислен родителски път:
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" ] }
} }
} }
} }
]);
Така че можете да направите търсенето си, както е посъветвано в предишния ви въпрос:
db.tree.aggregate([
{ $graphLookup: {
from: "rootless_tree",
startWith: "$path",
connectFromField: "path",
connectToField: "parent_path",
as:"dep"
} },
{ $match: { dep: [] } },
])