connectToField
は名前であり、表現ではありません。何もできません。
あなたは本当にスキーマを再考する必要があります。親参照で使用されている一意でない名前から始めて、多くの点で欠陥があります。代わりにパス文字列に依存しているため、 、親を参照するためのパスが必要です。
以下の回答は実行時のものであり、パフォーマンスが非効率的であるため、運用クエリにはほとんどお勧めできません パスがどのように構築されるかについてのいくつかの仮定。ただし、1回限りのリクエストとして使用できます。
基本的に、ビュー を作成する必要があります 計算された親パスを使用:
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: [] } },
])