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

หาค่าสูงสุด (Max) ในแต่ละกลุ่ม MongoDB ด้วย $group $max

การหาค่าสูงสุดในแต่ละกลุ่ม (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.