Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Chọn mục lớn nhất trong mỗi nhóm với MongoDB

Để 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: $group theo 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).