Để chọn mục có giá trị lớn nhất (max) trong mỗi nhóm, sử dụng $group với $max. Tạo collection:
> 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") }
Hiển thị dữ liệu (6 tài liệu, 2 quốc gia US/UK):
> db.demo659.find();
Kết quả:
Aggregation:
$grouptheo CountryName, tính MaxMarks = $max của Marks:> db.demo659.aggregate( { $group: { _id: {CountryName: "$CountryName" }, 'MaxMarks': { $max : "$Marks" } }})Kết quả - điểm cao nhất mỗi quốc gia: UK=75 (Chris), US=60 (David):
Mở rộng - lấy cả tên học sinh đạt điểm cao nhất: Cần pipeline phức tạp hơn (sort + group + $first):
db.demo659.aggregate([ { $sort: { Marks: -1 } }, { $group: { _id: "$CountryName", TopStudent: { $first: "$$ROOT" } } }, { $project: { _id: 0, CountryName: "$_id", Name: "$TopStudent.Name", MaxMarks: "$TopStudent.Marks" } } ])Kết quả sẽ có thêm tên: UK → Chris (75), US → David (60).