Giới thiệu
Để tính giá trị trung bình (average) của một trường trên tất cả tài liệu trong collection, bạn dùng aggregation pipeline với stage $group và accumulator $avg.
Cú pháp
db.collection.aggregate([
{
$group: {
_id: null, // Gom tất cả vào một nhóm
tenTruongTrungBinh: { $avg: "$tenTruongCanTinh" }
}
}
]);
Ví dụ minh họa
1. Tạo collection điểm game
> db.trungBinhDemo.insertOne({ "DiemGame": 45 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ed66bd628fa4220163b95") }
> db.trungBinhDemo.insertOne({ "DiemGame": 55 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ed671d628fa4220163b96") }
> db.trungBinhDemo.insertOne({ "DiemGame": 65 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ed676d628fa4220163b97") }
> db.trungBinhDemo.insertOne({ "DiemGame": 35 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ed67bd628fa4220163b98") }
> db.trungBinhDemo.insertOne({ "DiemGame": 16 });
{ "acknowledged" : true, "insertedId" : ObjectId("5c9ed701d628fa4220163b99") }
2. Tính trung bình
> db.trungBinhDemo.aggregate({
$group: {
_id: null,
DiemTrungBinh: { $avg: "$DiemGame" }
}
});
3. Kết quả
{ "_id" : null, "DiemTrungBinh" : 43.2 }
(45 + 55 + 65 + 35 + 16) / 5 = 216 / 5 = 43.2
Mở rộng: Các accumulator thống kê khác
| Accumulator | Mô tả | Ví dụ |
|---|---|---|
$avg | Trung bình cộng | { $avg: "$diem" } |
$sum | Tổng cộng | { $sum: "$diem" } |
$min | Giá trị nhỏ nhất | { $min: "$diem" } |
$max | Giá trị lớn nhất | { $max: "$diem" } |
$first | Giá trị đầu tiên (theo thứ tự) | { $first: "$diem" } |
$last | Giá trị cuối cùng | { $last: "$diem" } |
$push | Gom tất cả giá trị vào mảng | { $push: "$diem" } |
$addToSet | Gom giá trị duy nhất vào mảng | { $addToSet: "$diem" } |
$stdDevPop | Độ lệch chuẩn tổng thể | { $stdDevPop: "$diem" } |
$stdDevSamp | Độ lệch chuẩn mẫu | { $stdDevSamp: "$diem" } |
Tính trung bình theo nhóm (Group by)
// Trung bình điểm theo từng sinh viên
db.diemGame.aggregate([
{ $group: {
_id: "$TenSinhVien",
DiemTrungBinh: { $avg: "$DiemGame" }
} }
]);
Lưu ý
$avgbỏ qua giá trịnullvàmissing, nhưng tính0- Kết quả luôn là double (số thực)
- _id: null nghĩa là gom toàn bộ collection thành 1 group
- Với dataset lớn, hãy dùng
allowDiskUse: truenếu cần