Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ค้นหาเอกสารใน MongoDB ที่มีอาร์เรย์ซ้อนที่มีข้อมูลและปรับรูปแบบผลลัพธ์

ค้นหาเอกสารที่มีอาร์เรย์ซ้อนที่มีข้อมูลใน 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" }

สรุป: เทคนิคนี้ช่วยให้สามารถดึงเฉพาะข้อมูลที่มีค่าจริงในอาร์เรย์ซ้อน และปรับโครงสร้างเอกสารผลลัพธ์ให้เหมาะกับการนำไปใช้งานต่อได้