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

Tính giá trị trung bình trong MongoDB nhóm theo null

Để 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 ý

  • $avg bỏ 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