Nó non-trivial
giải pháp.
YÊU CẦU
1 Chúng ta cần thêm trường bổ sung (hãy gọi nó là level
) cho biết vị trí của tài liệu bên trong hệ thống phân cấp.
|root 0
|-child A 1
|--child A_1 2
|-child B 1
2 Chúng ta cần define
độ sâu phân cấp trước đây (ví dụ:tối đa 3)
GIỚI HẠN
Để lọc từ cấp cụ thể, chúng tôi cần sửa đổi root
và children
$ trận đấu giá trị.
Đảm bảo luôn cấp độ phân cấp:
root - 0
children - 1
root - 1
children - 2
GIẢI PHÁP
db.documents.aggregate([
{
$facet: {
root: [
{
$match: {
level: 0
}
}
],
children: [
{
$match: {
level: 1
}
},
{
$graphLookup: {
from: "documents",
startWith: "$_id",
connectFromField: "_id",
connectToField: "parentId",
maxDepth: 0,
as: "hierarchy"
}
},
{
$sort: {
_id: 1
}
}
]
}
},
{
$unwind: "$root"
},
{
$project: {
"root._id": 1,
"root.name": 1,
"root.level": 1,
"root.hierarchy": {
$filter: {
input: "$children",
as: "sub_level",
cond: {
$eq: [
"$$sub_level.parentId",
"$root._id"
]
}
}
}
}
},
{
$replaceRoot: {
newRoot: "$root"
}
}
])
MongoPlayground (độ sâu tối đa:3) | MongoPlayground (độ sâu tối đa:4)
GIẢI THÍCH
-
Với
$facet
chúng tôi xác định cấu trúc mức.root
chỉ tất cả thư mục gốc.children
chứa tất cả trẻ em có con cháu cấp 1 trở lên. -
Chúng tôi
$filter
(hợp nhất) root và con theoparentId
-
Với
$project
và$replaceRoot
chúng tôi trả lại cấu trúc ban đầu.
LIÊN KẾT
https://docs.mongodb.com/manual/reference/operator/ tổng hợp / khía cạnh /
https://docs.mongodb.com/manual/ tham chiếu / toán tử / tổng hợp / bộ lọc /
https://docs.mongodb.com/manual/ tham chiếu / điều hành / tổng hợp / thay thếRoot /