ค้นหาเอกสารที่มีอาร์เรย์ซ้อนที่มีข้อมูลใน MongoDB
บทความนี้สาธิตวิธีการค้นหาเอกสารใน MongoDB ที่มีอาร์เรย์ซ้อน (nested array) ที่มีข้อมูลจริง (ไม่ใช่ค่าว่าง) และปรับรูปแบบผลลัพธ์ให้อยู่ในรูปแบบที่ต้องการ โดยใช้ Aggregation Pipeline
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo187 และเพิ่มเอกสาร 3 รายการ ซึ่งมีโครงสร้างฟิลด์ Details เป็นอาร์เรย์ของออบเจกต์ที่มีฟิลด์ Subject
> db.demo187.insertOne({
"_id": "101",
"Details": [
{ "Subject": "MongoDB" },
{ "Subject": "MySQL" }
]
});
{ "acknowledged": true, "insertedId": "101" }
> db.demo187.insertOne({
"_id": "102",
"Details": [
{ }
]
});
{ "acknowledged": true, "insertedId": "102" }
> db.demo187.insertOne({
"_id": "103",
"Details": [
{ "Subject": "MongoDB" },
{ "Subject": "MySQL" }
]
});
{ "acknowledged": true, "insertedId": "103" }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมดด้วย find()
> db.demo187.find();
ผลลัพธ์:
{ "_id": "101", "Details": [{ "Subject": "MongoDB" }, { "Subject": "MySQL" }] }
{ "_id": "102", "Details": [{ }] }
{ "_id": "103", "Details": [{ "Subject": "MongoDB" }, { "Subject": "MySQL" }] }
ขั้นตอนที่ 3: ใช้ Aggregation Pipeline เพื่อกรองและปรับรูปแบบ
ใช้ $unwind เพื่อแยกอาร์เรย์ Details, $project เพื่อเลือกฟิลด์ Subject, และ $match เพื่อกรองเฉพาะเอกสารที่มีฟิลด์ Subject อยู่จริง
> db.demo187.aggregate([
{ $unwind: "$Details" },
{ $project: { Subject: "$Details.Subject" } },
{ $match: { Subject: { $exists: true } } }
])
ผลลัพธ์ที่ได้
{ "_id": "101", "Subject": "MongoDB" }
{ "_id": "101", "Subject": "MySQL" }
{ "_id": "103", "Subject": "MongoDB" }
{ "_id": "103", "Subject": "MySQL" }
สรุป: เทคนิคนี้ช่วยให้สามารถดึงเฉพาะข้อมูลที่มีค่าจริงในอาร์เรย์ซ้อน และปรับโครงสร้างเอกสารผลลัพธ์ให้เหมาะกับการนำไปใช้งานต่อได้