การ Project (ดึงเฉพาะบางส่วน) อาร์เรย์หลายมิติใน MongoDB
เมื่อมีอาร์เรย์ซ้อนอาร์เรย์ (Nested Arrays) ต้องใช้ Aggregation Pipeline ร่วมกับ $unwind เพื่อ "แบน" โครงสร้างก่อนจึงจะเลือกข้อมูลได้ละเอียด
ตัวอย่างข้อมูล: คะแนนนักเรียนแบบหลายมิติ
> db.multiDimensionalArrayProjection.insertOne({
"StudentFirstName": "Chris",
"StudentMarks": [ [98, 99], [56, 79] ]
});
Pipeline: ดึงคะแนนตัวที่ 2 ของชุดที่ 1 (คือ 99)
> db.multiDimensionalArrayProjection.aggregate([
{ $unwind: '$StudentMarks' }, // แบนชั้นนอก: ได้ [98,99] และ [56,79]
{ $limit: 1 }, // เลือกชุดแรก ([98,99])
{ $project: { _id: 0, StudentMarks: 1 } }, // เก็บเฉพาะ StudentMarks
{ $unwind: '$StudentMarks' }, // แบนชั้นใน: ได้ 98, 99
{ $skip: 1 }, // ข้าม 98
{ $limit: 1 } // เลือก 99
]);
ผลลัพธ์
{ "StudentMarks" : 99 }
คำอธิบายขั้นตอน
$unwindครั้งแรก: แยกอาร์เรย์ชั้นนอกออกเป็นเอกสารย่อย 2 เอกสาร$limit: 1: เก็บเอกสารย่อยแรก (คือ[98, 99])$project: ตัด_idออก เก็บเฉพาะStudentMarks$unwindครั้งที่สอง: แยกอาร์เรย์ชั้นในออกเป็น 98 และ 99$skip: 1+$limit: 1: ข้ามตัวแรก เอาตัวที่สอง (99)
หมายเหตุ
- MongoDB 4.4+ รองรับ
$arrayElemAtและ$first/$lastใน $project ได้โดยตรง ไม่ต้อง $unwind หลายรอบ - ตัวอย่างนี้แสดงหลักการพื้นฐานของการจัดการ Nested Array