Để tính tổng giá trị của một trường (key) trên tất cả document trong collection MongoDB, bạn sử dụng Aggregation Framework với toán tử $sum.
Ví dụ minh họa
Tạo collection và dữ liệu
> db.sumOfValueDemo.insertOne({"Name":"Larry","Amount":14.50});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7272f684a30fbdfd592") }
> db.sumOfValueDemo.insertOne({"Name":"Mike","Amount":15.68});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7342f684a30fbdfd593") }
> db.sumOfValueDemo.insertOne({"Name":"Carol","Amount":50.32});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7412f684a30fbdfd594") }
> db.sumOfValueDemo.insertOne({"Name":"David","Amount":120.90});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8ee7532f684a30fbdfd595") }
Xem tất cả documents
> db.sumOfValueDemo.find().pretty();
{
"_id" : ObjectId("5c8ee7272f684a30fbdfd592"),
"Name" : "Larry",
"Amount" : 14.5
}
{
"_id" : ObjectId("5c8ee7342f684a30fbdfd593"),
"Name" : "Mike",
"Amount" : 15.68
}
{
"_id" : ObjectId("5c8ee7412f684a30fbdfd594"),
"Name" : "Carol",
"Amount" : 50.32
}
{
"_id" : ObjectId("5c8ee7532f684a30fbdfd595"),
"Name" : "David",
"Amount" : 120.9
}
Tính tổng Amount với Aggregation
> db.sumOfValueDemo.aggregate([
{ $group: { _id: '', "Amount": { $sum: "$Amount" } } },
{ $project: { _id: 0, "TotalAmount": "$Amount" } }
]);
{ "TotalAmount" : 201.4 }
Giải thích pipeline
- $group: Gom tất cả document vào một group (_id: null hoặc ''). Tính
$sum: "$Amount"cộng dồn giá trị trường Amount. - $project: Format lại output: ẩn _id, đổi tên trường Amount thành TotalAmount.
Cách đơn giản hơn (MongoDB 3.4+)
db.sumOfValueDemo.aggregate([
{ $group: { _id: null, TotalAmount: { $sum: "$Amount" } } }
])
{ "_id" : null, "TotalAmount" : 201.4 }
Tính tổng có điều kiện
// Chỉ tính Amount > 20
db.sumOfValueDemo.aggregate([
{ $match: { Amount: { $gt: 20 } } },
{ $group: { _id: null, TotalAmount: { $sum: "$Amount" } } }
])
Kết hợp nhiều phép tính
db.sumOfValueDemo.aggregate([
{ $group: {
_id: null,
TotalAmount: { $sum: "$Amount" },
Count: { $sum: 1 },
AvgAmount: { $avg: "$Amount" },
MinAmount: { $min: "$Amount" },
MaxAmount: { $max: "$Amount" }
} }
])
{
"_id" : null,
"TotalAmount" : 201.4,
"Count" : 4,
"AvgAmount" : 50.35,
"MinAmount" : 14.5,
"MaxAmount" : 120.9
}
Lưu ý
- Trường phải là kiểu số (number) để $sum hoạt động chính xác
- Document thiếu trường hoặc trường không phải số sẽ bị bỏ qua (treated as 0)
- Dùng
$matchtrước $group để lọc dữ liệu, tăng hiệu năng