ใช้ Aggregation Framework ร่วมกับ $unwind, $sort, $limit เพื่อหาค่าสูงสุดจาก Sub-arrays
ตัวอย่างการใช้งาน
สร้างคอลเลกชันพร้อมข้อมูลนักเรียนและคะแนนคณิตศาสตร์:
> db.findHighestValueDemo.insertOne(
... {
... _id: 10001,
... "StudentDetails": [
... { "StudentName": "Chris", "StudentMathScore": 56},
... { "StudentName": "Robert", "StudentMathScore": 47 },
... { "StudentName": "John", "StudentMathScore": 98 }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 10001 }
> db.findHighestValueDemo.insertOne(
... {
... _id: 10002,
... "StudentDetails": [
... { "StudentName": "Ramit", "StudentMathScore": 89},
... { "StudentName": "David", "StudentMathScore": 76 },
... { "StudentName": "Bob", "StudentMathScore": 97 }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 10002 }
แสดงเอกสารทั้งหมด:
> db.findHighestValueDemo.find().pretty();
ผลลัพธ์:
ค้นหาค่าสูงสุดจาก Sub-arrays ทั้งหมด
> db.findHighestValueDemo.aggregate([ ... {$project:{"StudentDetails.StudentName":1, "StudentDetails.StudentMathScore":1}}, ... {$unwind:"$StudentDetails"}, ... {$sort:{"StudentDetails.StudentMathScore":-1}}, ... {$limit:1} ... ]).pretty();ผลลัพธ์ (คะแนนสูงสุดคือ 98 ของ John):
ขั้นตอน Pipeline:
$project- เลือกฟิลด์ที่ต้องการ$unwind- แยกอาร์เรย์ StudentDetails เป็นเอกสารแยกต่างหาก$sort- เรียงลำดับคะแนนจากมากไปน้อย (-1)$limit: 1- เอาเฉพาะอันดับแรก