connectToField
là một tên, không phải là một biểu thức. Bạn không thể làm gì với nó.
Bạn thực sự cần phải xem xét lại lược đồ. Nó có thiếu sót trong nhiều cách bắt đầu từ các tên không phải là duy nhất được sử dụng trong các tham chiếu gốc. Vì bạn dựa vào chuỗi đường dẫn thay vì , bạn cần một đường dẫn để tham chiếu đến phụ huynh.
Câu trả lời dưới đây thực hiện thời gian chạy và hầu như không được khuyến khích cho các truy vấn hoạt động do hiệu suất không hiệu quả và một số giả định về cách xây dựng đường dẫn. Tuy nhiên, nó có thể được sử dụng như một yêu cầu một lần.
Về cơ bản, bạn cần tạo một chế độ xem với đường dẫn mẹ được tính toán:
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" ] }
} }
} }
} }
]);
Vì vậy, sau đó bạn có thể thực hiện tra cứu của mình như đã khuyên trong câu hỏi trước của bạn:
db.tree.aggregate([
{ $graphLookup: {
from: "rootless_tree",
startWith: "$path",
connectFromField: "path",
connectToField: "parent_path",
as:"dep"
} },
{ $match: { dep: [] } },
])