Bạn đã mắc phải sai lầm cổ điển là đặt tên trường tùy ý. MongoDB là "không có lược đồ", nhưng nó không có nghĩa là bạn không cần phải suy nghĩ về lược đồ của mình. Các tên khóa phải mang tính mô tả và trong trường hợp của bạn, ví dụ:"S2" không thực sự có nghĩa. Để thực hiện hầu hết các loại truy vấn và hoạt động, bạn sẽ cần thiết kế lại lược đồ để lưu trữ dữ liệu của mình như sau:
_id:...
Segment:[
{ field: "S1", value: 1 },
{ field: "S2", value: 5 },
{ field: "Sn", value: 10 },
]
Sau đó, bạn có thể chạy truy vấn của mình như:
db.collection.aggregate( [
{ $unwind: "$Segment" },
{ $group: {
_id: '$_id',
sum: { $sum: '$Segment.value' }
} }
] );
Kết quả sau đó dẫn đến một cái gì đó như thế này (với tài liệu duy nhất từ câu hỏi của bạn):
{
"result" : [
{
"_id" : ObjectId("51e4772e13573be11ac2ca6f"),
"sum" : 16
}
],
"ok" : 1
}