Để tính tổng, đếm số lượng có điều kiện trong một nhóm (group) duy nhất, MongoDB Aggregation sử dụng $group kết hợp $sum và $cond. Điều này cho phép tính nhiều metric khác nhau trong một lần quét dữ liệu.
1. Tạo bộ sưu tập điểm số
> db.demo406.insertOne({ "Score": 35 });
> db.demo406.insertOne({ "Score": 55 });
> db.demo406.insertOne({ "Score": 35 });
> db.demo406.insertOne({ "Score": 45 });
> db.demo406.insertOne({ "Score": 65 });
> db.demo406.insertOne({ "Score": 45 });
2. Xem dữ liệu
> db.demo406.find();
Kết quả: 6 tài liệu với các Score: 35, 55, 35, 45, 65, 45.
3. Aggregation: Tính 3 chỉ số trong 1 group
> db.demo406.aggregate([
{
$group: {
_id: null,
Score1: { $sum: { $cond: [{ $eq: ["$Score", 35] }, 1, 0] } }, // Đếm Score = 35
Score2: { $sum: { $cond: [{ $ne: ["$Score", 35] }, 1, 0] } }, // Đếm Score != 35
Score3: { $sum: { $cond: [{ $ne: ["$Score", 59] }, "$Score", 0] } } // Tổng Score != 59
}
}
]);
4. Kết quả
{ "_id": null, "Score1": 2, "Score2": 4, "Score3": 280 }
Giải thích:
Score1: Có 2 bản ghi Score = 35.Score2: Có 4 bản ghi Score ≠ 35 (55, 45, 65, 45).Score3: Tổng các Score ≠ 59 (tất cả vì không có 59) = 35+55+35+45+65+45 = 280.
Mẹo: Dùng $facet (MongoDB 3.4+) để chạy nhiều group song song trong 1 pipeline.