Để tính tổng các trường số trong mảng object (dictionary) trên tất cả document, dùng $unwind tách mảng rồi $group theo tên.
Dữ liệu mẫu
2 document, mỗi doc có mảng Details chứa object {Name, Value1, Value2, Value3}:
Doc 1: Chris(20,30,10), David(10,50,30)
Doc 2: Chris(20,10,20), David(30,40,10)
Pipeline aggregate
> db.demo117.aggregate([
{ $unwind: "$Details" },
{ $group: {
_id: "$Details.Name",
"Value1": { $sum: "$Details.Value1" },
"Value2": { $sum: "$Details.Value2" },
"Value3": { $sum: "$Details.Value3" }
}}
]);
Kết quả
{ "_id" : "David", "Value1" : 40, "Value2" : 90, "Value3" : 40 }
{ "_id" : "Chris", "Value1" : 40, "Value2" : 40, "Value3" : 30 }
Giải thích:
$unwind: "$Details": Biến mảng Details thành các document riêng (4 doc từ 2 doc gốc)$group: Nhóm theoDetails.Name(Chris/David)$sum: Cộng dồn từng trường Value1, Value2, Value3 riêng biệt
Kết quả chi tiết:
- Chris: Value1=20+20=40, Value2=30+10=40, Value3=10+20=30
- David: Value1=10+30=40, Value2=50+40=90, Value3=30+10=40
Pattern này dùng cho báo cáo, analytics trên dữ liệu lồng mảng object.