Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB Aggregation: หานักเรียนที่คะแนนสอบครั้งแรกต่ำกว่าค่าเฉลี่ยรวม


เปรียบเทียบคะแนนสอบครั้งแรกกับค่าเฉลี่ยรวมทั้งหมด

ใช้ 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"] }

คำอธิบายขั้นตอน

  1. $project (ขั้นแรก) - คำนวณค่าเฉลี่ยของแต่ละคนจาก 3 คะแนน
  2. $group - รวมข้อมูลทั้งหมด คำนวณค่าเฉลี่ยรวม (totalAverage) และเก็บคู่ Name-Value1
  3. $project (ขั้นที่สอง) - ใช้ $filter กรองเฉพาะคนที่ Value1 < totalAverage แล้ว $map ดึงชื่อออกมา

การประยุกต์ใช้

รูปแบบนี้ใช้ได้กับการวิเคราะห์ผลสอบ, ประเมินผลงาน, หรือตรวจสอบค่าผิดปกติ (anomaly detection) ในข้อมูลหลายมิติ