ใช้ Aggregation Framework: $unwind แยก Array → $sort เรียงลำดับ → $group รวมกลับ → $project จัดรูปแบบ
สร้างข้อมูลตัวอย่าง (Deep Nested Array)
> db.sortInnerArrayDemo.insertOne({
"EmployeeDetails": {
"EmployeeAddress": {
"EmployeeCountry": [
{"EmployeeZipCode": 1003, "EmployeeStreetName": "7885 Trusel Street"},
{"EmployeeZipCode": 1001, "EmployeeStreetName": "7390 Gonzales Drive"},
{"EmployeeZipCode": 1002, "EmployeeStreetName": "444 N.Myres Rd."}
]
}
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c6f07d3da34711ecf87a5b8") }
แสดงข้อมูลก่อน Sort (ZipCode ไม่เรียง: 1003, 1001, 1002)
> db.sortInnerArrayDemo.find().pretty();
Case 1: Sort Ascending (น้อยไปมาก) ตาม ZipCode
> db.sortInnerArrayDemo.aggregate([
{$unwind: "$EmployeeDetails.EmployeeAddress.EmployeeCountry"},
{$sort: {"EmployeeDetails.EmployeeAddress.EmployeeCountry.EmployeeZipCode": 1}},
{$group: {_id: "$_id", "EmpCountry": {$push: "$EmployeeDetails.EmployeeAddress.EmployeeCountry"}}},
{$project: {"EmployeeDetails.EmployeeAddress.EmployeeCountry": "$EmpCountry"}}
]).pretty();
ผลลัพธ์ Ascending (1001, 1002, 1003)
"EmployeeCountry" : [
{"EmployeeZipCode" : 1001, "EmployeeStreetName" : "7390 Gonzales Drive"},
{"EmployeeZipCode" : 1002, "EmployeeStreetName" : "444 N.Myres Rd."},
{"EmployeeZipCode" : 1003, "EmployeeStreetName" : "7885 Trusel Street"}
]
Case 2: Sort Descending (มากไปน้อย) ตาม ZipCode
> db.sortInnerArrayDemo.aggregate([
{$unwind: "$EmployeeDetails.EmployeeAddress.EmployeeCountry"},
{$sort: {"EmployeeDetails.EmployeeAddress.EmployeeCountry.EmployeeZipCode": -1}},
{$group: {_id: "$_id", "EmpCountry": {$push: "$EmployeeDetails.EmployeeAddress.EmployeeCountry"}}},
{$project: {"EmployeeDetails.EmployeeAddress.EmployeeCountry": "$EmpCountry"}}
]).pretty();
ผลลัพธ์ Descending (1003, 1002, 1001)
"EmployeeCountry" : [
{"EmployeeZipCode" : 1003, "EmployeeStreetName" : "7885 Trusel Street"},
{"EmployeeZipCode" : 1002, "EmployeeStreetName" : "444 N.Myres Rd."},
{"EmployeeZipCode" : 1001, "EmployeeStreetName" : "7390 Gonzales Drive"}
]
Pipeline นี้ Sort Array ภายใน Document ได้ แม้จะ Nested หลายชั้น