Để nhóm và đếm số lượng phần tử mảng từ các trường lồng nhau động, dùng $objectToArray, $unwind và $group.
Dữ liệu mẫu phức tạp
2 document với cấu trúc:
Details: {
X: { Values: [10,30,50], Number: 3 },
Y: { Values: [1000,180], Number: 2 }
}
Details: {
X: { Values: [100,300,500,6000], Number: 4 },
Y: { Values: [10,20,60], Number: 3 }
}
Pipeline aggregate
> db.demo99.aggregate([
{ $project: { Count: { $objectToArray: "$Details" } } },
{ $unwind: "$Count" },
{ $group: {
_id: "$Count.k",
count: { $sum: "$Count.v.Number" }
}}
]);
Kết quả
{ "_id" : "Y", "count" : 5 }
{ "_id" : "X", "count" : 7 }
Giải thích từng bước:
$objectToArray: "$Details": Chuyển object {X:..., Y:...} thành mảng [{k:"X", v:{...}}, {k:"Y", v:{...}}]$unwind: "$Count": Tách mảng thành 2 document riêng (mỗi doc 1 key X hoặc Y)$group: Nhóm theo_id: "$Count.k"(tên key X/Y), cộng dồn$Count.v.Number
Kết quả: X: 3+4=7, Y: 2+3=5. Cách này linh hoạt khi tên trường con (X, Y) không cố định hoặc nhiều hơn.