เพื่อเรียงลำดับตาม Subdocument ให้ใช้ $sort ใน MongoDB Aggregation Pipeline
สร้างคอลเลกชันพร้อมเอกสารที่มีอาร์เรย์ details (มี typo "deatils" ในเอกสารแรก):
> db.demo245.insertOne(
... {
... "_id": 101,
... "deatils": [
... { "DueDate": new ISODate("2019-01-10"), "Value": 45},
... {"DueDate": new ISODate("2019-11-10"), "Value": 34 }
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo245.insertOne(
... {
... "_id": 102,
... "details": [
... { "DueDate": new ISODate("2019-12-11"), "Value": 29},
... {"DueDate": new ISODate("2019-03-10"), "Value": 78}
... ]
... }
...);
{ "acknowledged" : true, "insertedId" : 102 }
แสดงเอกสารทั้งหมด:
> db.demo245.find();
ผลลัพธ์:
คำสั่ง Aggregation: $unwind แยกอาร์เรย์ details, $sort เรียงตาม _id แล้ว Value desc, $group รวมกลับ, $sort อีกครั้งตาม Value desc:
> db.demo245.aggregate([ ... { "$unwind": "$details" }, ... { "$sort": { "_id": 1, "details.Value": -1 } }, ... { "$group": { ... "_id": "$_id", ... "details": { "$push": "$details" } ... }}, ... { "$sort": { "details.Value": -1 } } ...])ผลลัพธ์ - เหลือเฉพาะ _id 102 (เพราะ $sort สุดท้ายเรียงตาม Value desc และอาจมีการกรองนำหน้า) พร้อม details เรียง Value มากไปน้อย: