บทความนี้สาธิตการใช้ $group กับ _id: null เพื่อคำนวณค่าเฉลี่ย (Average) ของฟิลด์ตัวเลขทั้งหมดในคอลเลกชัน (Global Average) โดยไม่จัดกลุ่ม
ไวยากรณ์พื้นฐาน
db.yourCollectionName.aggregate([
{ $group: { _id: null, "anyFieldName": { $avg: "$yourFieldName" } } }
]);
สร้างข้อมูลตัวอย่าง
> 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") }
แสดงข้อมูลทั้งหมด
> db.caculateTheAverageValueDemo.find().pretty();
{ "_id" : ObjectId("5cd68a197924bb85b3f4895f"), "Population" : 100 }
{ "_id" : ObjectId("5cd68a1c7924bb85b3f48960"), "Population" : 500 }
{ "_id" : ObjectId("5cd68a237924bb85b3f48961"), "Population" : 200 }
{ "_id" : ObjectId("5cd68a297924bb85b3f48962"), "Population" : 100 }
{ "_id" : ObjectId("5cd68a2e7924bb85b3f48963"), "Population" : 100 }
คำนวณค่าเฉลี่ย Population ทั้งคอลเลกชัน
> db.caculateTheAverageValueDemo.aggregate([
{ $group: { _id: null, "AveragePopulation": { $avg: "$Population" } } }
]);
ผลลัพธ์
{ "_id" : null, "AveragePopulation" : 200 }
การคำนวณ: (100 + 500 + 200 + 100 + 100) / 5 = 1000 / 5 = 200
คำอธิบาย _id: null
_id: nullหมายถึง Group ทุก Document เข้าเป็น Group เดียว (Single Group)- เหมือน
GROUP BY ()ใน SQL (ไม่มี GROUP BY Column) - ผลลัพธ์จะมีเพียง 1 Document เดียว
ตัวอย่างเพิ่มเติม: คำนวณหลายสถิติพร้อมกัน
db.caculateTheAverageValueDemo.aggregate([
{ $group: {
_id: null,
avgPop: { $avg: "$Population" },
minPop: { $min: "$Population" },
maxPop: { $max: "$Population" },
sumPop: { $sum: "$Population" },
count: { $sum: 1 }
}}
]);
{ "_id" : null, "avgPop" : 200, "minPop" : 100, "maxPop" : 500, "sumPop" : 1000, "count" : 5 }
ตัวอย่าง: ค่าเฉลี่ยแบบมีน้ำหนัก (Weighted Average)
db.grades.aggregate([
{ $group: {
_id: null,
weightedAvg: { $avg: { $multiply: ["$score", "$weight"] } }
}}
]);