ใช้ $sort และ $group ใน Aggregate
เรียงลำดับค่าจากมากไปน้อยก่อน ($sort: { value: -1 }) แล้วจับกลุ่มตาม id และเอาค่าแรก ($first) ซึ่งจะเป็นค่าสูงสุด
สร้างข้อมูลตัวอย่าง
> db.demo750.insertOne({id:101,value:50});
> db.demo750.insertOne({id:102,value:40});
> db.demo750.insertOne({id:101,value:110});
แสดงข้อมูลทั้งหมด
> db.demo750.find();
ผลลัพธ์:
{ "_id" : ObjectId("5eae74b2a930c785c834e566"), "id" : 101, "value" : 50 }
{ "_id" : ObjectId("5eae74c8a930c785c834e567"), "id" : 102, "value" : 40 }
{ "_id" : ObjectId("5eae74dba930c785c834e568"), "id" : 101, "value" : 110 }
คิวรีหาค่า value สูงสุดของแต่ละ id
> db.demo750.aggregate([
{ $sort: { value: -1 } },
{ $group: { _id: "$id", value: { $first: "$value" } } },
{ $project: { id: "$_id", value: 1 } }
])
ผลลัพธ์
{ "_id" : 102, "value" : 40, "id" : 102 }
{ "_id" : 101, "value" : 110, "id" : 101 }