ดึงเฉพาะองค์ประกอบที่ต้องการจากอาร์เรย์ใน MongoDB
บทความนี้สาธิตวิธีการแสดงเฉพาะองค์ประกอบ (element) ที่ตรงตามเงื่อนไขภายในอาร์เรย์ โดยใช้ Aggregation Pipeline ประกอบด้วย $match, $unwind, และ $project
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo204 ซึ่งมีฟิลด์ details เป็นอาร์เรย์ของออบเจกต์ที่มีโครงสร้างไม่เหมือนกัน (บางรายการมีฟิลด์ครบ บางรายการไม่ครบ)
> db.demo204.insertOne({
"_id": 101,
"Name": "Chris",
"Age": 23,
"details": [
{ "id": "1001", "empId": "John_1001", "salary": "50000", "Technology": "Java" },
{ "id": "1002", "empId": "John_1002" },
{ "id": "1003", "empId": "John_10003", "salary": "60000", "Technology": "MongoDB" }
]
});
{ "acknowledged": true, "insertedId": 101 }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo204.find();
ผลลัพธ์:
{ "_id": 101, "Name": "Chris", "Age": 23, "details": [
{ "id": "1001", "empId": "John_1001", "salary": "50000", "Technology": "Java" },
{ "id": "1002", "empId": "John_1002" },
{ "id": "1003", "empId": "John_10003", "salary": "60000", "Technology": "MongoDB" }
] }
ขั้นตอนที่ 3: Aggregation Pipeline เพื่อดึงเฉพาะองค์ประกอบที่ต้องการ
1. $match กรองเอกสารที่มี details.id เท่ากับ "1001"
2. $unwind แยกอาร์เรย์ details เป็นเอกสารแยกต่างหาก
3. $match อีกครั้งเพื่อกรองเฉพาะ details.id = "1001"
4. $project เลือกเฉพาะฟิลด์ Technology และซ่อน _id
> db.demo204.aggregate([
{ "$match": { "details.id": "1001" }},
{ "$unwind": "$details" },
{ "$match": { "details.id": "1001" }},
{ "$project": { "Technology": "$details.Technology", "_id": 0 }}
])
ผลลัพธ์ที่ได้
{ "Technology": "Java" }
สรุป: เทคนิคนี้เหมาะสำหรับการดึงข้อมูลเฉพาะส่วนจากอาร์เรย์ซ้อน โดยไม่ต้องดึงเอกสารทั้งหมดมาแล้วค่อยกรองฝั่งแอปพลิเคชัน