Để aggregation trên tài liệu lồng nhau sâu, sử dụng aggregate() với $unwind và $group. Tạo collection:
> db.demo199.insertOne({
"details1": {
"details2": {
"details3": {
"Name": "Chris",
"details4": {
"details5": { "v1": 10, "v2": 20, "v3": 30 }
}
}
}
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3c24aa03d395bdc21346e2") }
> db.demo199.insertOne({
"details1": {
"details2": {
"details3": {
"Name": "Chris",
"details4": {
"details5": { "v1": 30, "v2": 40, "v3": 50 }
}
}
}
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3c24ab03d395bdc21346e3") }
Hiển thị tài liệu:
> db.demo199.find();
Kết quả - cấu trúc lồng nhau 5 cấp:
Aggregation tính tổng các trường v1, v2, v3 qua tất cả tài liệu:
> var out = [ { "$unwind": "$details1.details2" }, { "$group": { "_id": "$details1.details2._id", "v1": { "$sum": "$details1.details2.details3.details4.details5.v1" }, "v2": { "$sum": "$details1.details2.details3.details4.details5.v2" }, "v3": { "$sum": "$details1.details2.details3.details4.details5.v3" } }} ] > result = db.demo199.aggregate(out);Kết quả tổng hợp:
Lưu ý: Đường dẫn trường rất dài do cấu trúc lồng nhau sâu. Trong thực tế, nên thiết kế schema phẳng hơn để dễ truy vấn.