Bắt đầu từ MongoDB 3.4, chúng ta có thể thực hiện việc này với Khung tổng hợp.
Giai đoạn đầu tiên và quan trọng nhất trong quy trình của chúng tôi là $graphLookup
sân khấu. $graphLookup
cho phép chúng tôi so khớp đệ quy trên trường "cha" và "tên". Kết quả là, chúng tôi nhận được tổ tiên của mỗi "tên".
Giai đoạn tiếp theo trong quy trình là $match
giai đoạn mà chúng tôi chỉ cần chọn "tên" mà chúng tôi quan tâm.
Giai đoạn cuối cùng là $addFields
hoặc $project
giai đoạn mà chúng tôi áp dụng một biểu thức cho mảng "tổ tiên" bằng cách sử dụng $map
toán tử mảng.
Tất nhiên với $reverseArray
toán tử chúng tôi đảo ngược mảng của chúng tôi
để có được kết quả mong đợi.
db.collection.aggregate(
[
{ "$graphLookup": {
"from": "collection",
"startWith": "$parent",
"connectFromField": "parent",
"connectToField": "name",
"as": "ancestors"
}},
{ "$match": { "name": "D" } },
{ "$addFields": {
"ancestors": {
"$reverseArray": {
"$map": {
"input": "$ancestors",
"as": "t",
"in": { "name": "$$t.name" }
}
}
}
}}
]
)