การหาค่าสูงสุดในแต่ละกลุ่ม (group by max) ใช้ $group ร่วมกับ $max
> db.demo659.insertOne({Name: "Chris", CountryName: "US", "Marks": 50});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cf9") }
> db.demo659.insertOne({Name: "David", CountryName: "US", "Marks": 60});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfa") }
> db.demo659.insertOne({Name: "Mike", CountryName: "US", "Marks": 55});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfb") }
> db.demo659.insertOne({Name: "Chris", CountryName: "UK", "Marks": 75});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfc") }
> db.demo659.insertOne({Name: "David", CountryName: "UK", "Marks": 54});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50724113ea5458c7cfd") }
> db.demo659.insertOne({Name: "Mike", CountryName: "UK", "Marks": 72});
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1a50824113ea5458c7cfe") }
แสดงข้อมูล:
> db.demo659.find();
คิวรีหาคะแนนสูงสุดต่อ CountryName
> db.demo659.aggregate({ $group: { ... _id: {CountryName: "$CountryName"}, ... 'MaxMarks': { $max: "$Marks" } ... }});ผลลัพธ์:
หากต้องการดูชื่อคนที่ได้คะแนนสูงสุดด้วย
ต้องใช้ pipeline ซับซ้อนกว่า (sort + group + first):
db.demo659.aggregate([ {$sort: {Marks: -1}}, {$group: {_id: "$CountryName", maxMarks: {$first: "$Marks"}, topStudent: {$first: "$Name"}}} ]);สรุป
- $max: หาค่าสูงสุดในกลุ่ม
- _id object: จัดกลุ่มตามหลายฟิลด์ได้ (เช่น {CountryName, Year})
- เหมาะสำหรับ: รายงานยอดขายสูงสุดต่อภูมิภาค, คะแนนสูงสุดต่อห้องเรียน, etc.