คำนวณสถิติหลายอย่างพร้อมกันในกลุ่มเดียวด้วย $sum และ $cond
ใช้ $group ร่วมกับ $sum และ $cond เพื่อคำนวณเงื่อนไขต่างๆ ในครั้งเดียว เช่น นับจำนวนที่เท่ากับค่าเฉพาะ นับจำนวนที่ไม่เท่ากับค่าเฉพาะ และรวมค่าที่ผ่านเงื่อนไข
ตัวอย่างข้อมูลทดสอบ
> db.demo406.insertOne({ "Score": 35 });
> db.demo406.insertOne({ "Score": 55 });
> db.demo406.insertOne({ "Score": 35 });
> db.demo406.insertOne({ "Score": 45 });
> db.demo406.insertOne({ "Score": 65 });
> db.demo406.insertOne({ "Score": 45 });
แสดงข้อมูลทั้งหมด
> db.demo406.find();
ผลลัพธ์: 6 เอกสาร มีค่า Score: 35, 55, 35, 45, 65, 45
คำสั่ง Aggregation คำนวณ 3 สถิติพร้อมกัน
> db.demo406.aggregate([
{
$group: {
_id: null,
Score1: { $sum: { $cond: [{ $eq: ["$Score", 35] }, 1, 0] } },
Score2: { $sum: { $cond: [{ $ne: ["$Score", 35] }, 1, 0] } },
Score3: { $sum: { $cond: [{ $ne: ["$Score", 59] }, "$Score", 0] } }
}
}
]);
ผลลัพธ์ที่ได้
{ "_id": null, "Score1": 2, "Score2": 4, "Score3": 280 }
คำอธิบายแต่ละฟิลด์
- Score1: นับจำนวนเอกสารที่ Score = 35 (มี 2 รายการ)
- Score2: นับจำนวนเอกสารที่ Score ≠ 35 (มี 4 รายการ)
- Score3: รวมค่า Score ของเอกสารที่ Score ≠ 59 (ทุกตัวเพราะไม่มี 59) = 35+55+35+45+65+45 = 280
รูปแบบ $cond
{ $cond: [
ใช้ร่วมกับ $sum เพื่อนับ (true=1, false=0) หรือรวมค่า (true=ค่าที่ต้องการ, false=0)
ประโยชน์
คำนวณสถิติหลายอย่างในหนึ่งครั้งของการอ่านข้อมูล (Single Pass) ประหยัดทรัพยากรมากกว่าการรันคิวรีหลายครั้ง