connectToField
adalah nama, bukan ekspresi. Anda tidak dapat melakukan apa pun dengannya.
Anda benar-benar perlu mempertimbangkan kembali skema. Itu cacat dalam banyak hal mulai dari nama yang tidak unik yang digunakan dalam referensi induk. Karena Anda mengandalkan string jalur sebagai gantinya , Anda memerlukan jalur untuk mereferensikan induknya.
Jawaban di bawah ini menjalankannya, dan hampir tidak disarankan untuk kueri operasional karena inefisiensi kinerja dan beberapa asumsi tentang bagaimana jalan itu dibangun. Ini dapat digunakan sebagai permintaan satu kali saja.
Pada dasarnya Anda perlu membuat tampilan dengan jalur induk yang dihitung:
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" ] }
} }
} }
} }
]);
Jadi Anda dapat melakukan pencarian seperti yang disarankan pada pertanyaan Anda sebelumnya:
db.tree.aggregate([
{ $graphLookup: {
from: "rootless_tree",
startWith: "$path",
connectFromField: "path",
connectToField: "parent_path",
as:"dep"
} },
{ $match: { dep: [] } },
])