เปรียบเทียบคะแนนสอบครั้งแรกกับค่าเฉลี่ยรวมทั้งหมด
ใช้ aggregation pipeline หลายขั้นตอน เพื่อคำนวณค่าเฉลี่ยของแต่ละคน แล้วหาค่าเฉลี่ยรวม และกรองหาคนที่คะแนนสอบครั้งแรกต่ำกว่าค่าเฉลี่ยรวม
ตัวอย่างข้อมูล
> db.demo432.insertOne({ "_id": 101, "Name": "David", "Value1": 67, "Value2": 87, "Value3": 78 });
> db.demo432.insertOne({ "_id": 102, "Name": "Sam", "Value1": 98, "Value2": 45, "Value3": 90 });
Query แบบสมบูรณ์
> db.demo432.aggregate([
{ $project: {
Name: "$Name",
Value1: "$Value1",
average: { $avg: ["$Value1", "$Value2", "$Value3"] }
}},
{ $group: {
_id: null,
NameValue1: { $push: { Name: "$Name", Value1: "$Value1" } },
totalAverage: { $avg: "$average" }
}},
{ $project: {
lessthanAverageNames: {
$map: {
input: { $filter: { input: "$NameValue1", as: "out", cond: { $lt: ["$$out.Value1", "$totalAverage"] } } },
as: "o",
in: "$$o.Name"
}
}
}}
]);
ผลลัพธ์
{ "_id": null, "lessthanAverageNames": ["David"] }
คำอธิบายขั้นตอน
- $project (ขั้นแรก) - คำนวณค่าเฉลี่ยของแต่ละคนจาก 3 คะแนน
- $group - รวมข้อมูลทั้งหมด คำนวณค่าเฉลี่ยรวม (totalAverage) และเก็บคู่ Name-Value1
- $project (ขั้นที่สอง) - ใช้ $filter กรองเฉพาะคนที่ Value1 < totalAverage แล้ว $map ดึงชื่อออกมา
การประยุกต์ใช้
รูปแบบนี้ใช้ได้กับการวิเคราะห์ผลสอบ, ประเมินผลงาน, หรือตรวจสอบค่าผิดปกติ (anomaly detection) ในข้อมูลหลายมิติ