Để tính trung bình của một trường trên toàn bộ collection (không chia nhóm), MongoDB Aggregation Framework sử dụng $group với _id: null kết hợp toán tử $avg. Cách này gom tất cả tài liệu thành một nhóm duy nhất.
Cú pháp
db.yourCollectionName.aggregate([
{$group: {_id: null, "anyFieldName": {$avg: "$yourFieldName"}}}
]);
Tạo dữ liệu mẫu
> db.caculateTheAverageValueDemo.insertOne({"Population":100});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd68a197924bb85b3f4895f") }
> db.caculateTheAverageValueDemo.insertOne({"Population":500});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd68a1c7924bb85b3f48960") }
> db.caculateTheAverageValueDemo.insertOne({"Population":200});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd68a237924bb85b3f48961") }
> db.caculateTheAverageValueDemo.insertOne({"Population":100});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd68a297924bb85b3f48962") }
> db.caculateTheAverageValueDemo.insertOne({"Population":100});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd68a2e7924bb85b3f48963") }
Xem dữ liệu
> db.caculateTheAverageValueDemo.find().pretty();
Tính trung bình Population
> db.caculateTheAverageValueDemo.aggregate([{$group: {_id:null, "AveragePopulation": {$avg:"$Population"} }}]);Kết quả
Giải thích
_id: null: Khóa nhóm là null → gom tất cả tài liệu thành 1 nhóm$avg: "$Population": Tính trung bình cộng của trường Population- (100 + 500 + 200 + 100 + 100) / 5 = 1000 / 5 = 200
- Giá trị null/bỏ qua trong tính toán
Các biến thể
Tính trung bình có điều kiện
db.caculateTheAverageValueDemo.aggregate([
{$match: {Population: {$gt: 150}}}, // Chỉ tính các giá trị > 150
{$group: {_id: null, AveragePopulation: {$avg: "$Population"}}}
]);
Tính nhiều thống kê cùng lúc
db.caculateTheAverageValueDemo.aggregate([
{$group: {
_id: null,
AveragePopulation: {$avg: "$Population"},
TotalPopulation: {$sum: "$Population"},
MinPopulation: {$min: "$Population"},
MaxPopulation: {$max: "$Population"},
Count: {$sum: 1}
}}
]);
Nhóm theo trường khác (ví dụ: theo Category)
db.caculateTheAverageValueDemo.aggregate([
{$group: {_id: "$Category", AveragePopulation: {$avg: "$Population"}}}
]);
Lưu ý
$avgbỏ qua giá trị null và missing field- Kết quả là double (số thực), có thể làm tròn với
$round(MongoDB 4.2+) - Tạo index trên trường Population để tối ưu:
db.caculateTheAverageValueDemo.createIndex({Population: 1}) - Với collection lớn, bật
allowDiskUse: true