เพื่อจัดเรียงข้อมูลภายใน Sub-array ต้องใช้ Aggregation Pipeline โดยทำ $unwind ก่อน แล้วค่อย $sort และ $group กลับไปเป็นอาร์เรย์
ตัวอย่างข้อมูลทดสอบ
> db.demo23.insertOne({
"StudentDetails" : [
{"Name" : "David", "Age" : 23},
{"Name" : "Adam", "Age" : 24}
]
});
แสดงข้อมูลก่อนจัดเรียง
> db.demo23.find().pretty()
{
"_id" : ObjectId("5e14c3eb22d07d3b95082e71"),
"StudentDetails" : [
{"Name" : "David", "Age" : 23},
{"Name" : "Adam", "Age" : 24}
]
}
คำสั่ง Aggregation สำหรับจัดเรียง Sub-array
> db.demo23.aggregate([
{ "$unwind" : "$StudentDetails" },
{ "$sort" : { "StudentDetails.Name" : 1 }},
{ "$group" : {
"StudentDetails" : { "$push" : { "Name" : "$StudentDetails.Name" }},
"_id" : null
}},
{ "$project" : { "_id" : 0, "StudentDetails" : 1 }}
]);
ผลลัพธ์หลังจัดเรียงตามชื่อ A-Z
{
"StudentDetails" : [
{ "Name" : "Adam" },
{ "Name" : "David" }
]
}
ขั้นตอนสำคัญ:
$unwind- แยกอาร์เรย์เป็นเอกสารแยกต่างหาก$sort- จัดเรียงตามฟิลด์ที่ต้องการ$group- รวมกลับเป็นอาร์เรย์ด้วย$push$project- จัดรูปแบบผลลัพธ์สุดท้าย