Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Cách tính trung bình của toàn bộ một trường dùng Aggregation trong MongoDB

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

AccumulatorMô tảVí dụ
$avgTrung bình cộng{ $avg: "$diem" }
$sumTổng cộng{ $sum: "$diem" }
$minGiá trị nhỏ nhất{ $min: "$diem" }
$maxGiá trị lớn nhất{ $max: "$diem" }
$firstGiá trị đầu tiên (theo thứ tự){ $first: "$diem" }
$lastGiá trị cuối cùng{ $last: "$diem" }
$pushGom tất cả giá trị vào mảng{ $push: "$diem" }
$addToSetGom 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 ý

  • $avg bỏ qua giá trị null và missing, nhưng tính 0
  • 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: true nếu cần