ลบรายการจาก Nested Array (อาร์เรย์ในอาร์เรย์) ด้วย $pull
บทความนี้สาธิตวิธีการลบรายการเฉพาะจากอาร์เรย์ที่ซ้อนอยู่ภายในอีกอาร์เรย์หนึ่ง (Array within Array) โดยใช้ $pull ร่วมกับ Positional Operator $ ในคำสั่ง update()
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo213 โครงสร้าง: details1 เป็นอาร์เรย์ -> แต่ละออบเจกต์มี details2 เป็นอาร์เรย์อีกทีหนึ่ง
> db.demo213.insertOne({
"id": 101,
"details1": [
{
"Name": "Chris",
"details2": [
{ "StudentName": "David", "Subject": "MongoDB" },
{ "StudentName": "Mike", "Subject": "MySQL" }
]
}
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e3e300c03d395bdc2134704") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo213.find().pretty();
ผลลัพธ์:
{ "_id": ObjectId("5e3e300c03d395bdc2134704"), "id": 101, "details1": [
{ "Name": "Chris", "details2": [
{ "StudentName": "David", "Subject": "MongoDB" },
{ "StudentName": "Mike", "Subject": "MySQL" }
]}
] }
ขั้นตอนที่ 3: ลบรายการใน details2 ที่มี Subject: "MySQL" ภายใต้ Name: "Chris"
Query: หาเอกสาร id: 101 และ details1.Name: "Chris" แล้ว $pull จาก details1.$.details2 (Positional $ อ้างถึงออบเจกต์ใน details1 ที่ตรง) โดยเงื่อนไข Subject: "MySQL"
> db.demo213.update(
{"id": 101, "details1.Name": "Chris"},
{ "$pull": { "details1.$.details2": { "Subject": "MySQL" } } },
{ multi: true }
);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
ขั้นตอนที่ 4: ตรวจสอบผลลัพธ์
> db.demo213.find().pretty();
ผลลัพธ์: เหลือเฉพาะรายการ Subject: "MongoDB" ใน details2
{ "_id": ObjectId("5e3e300c03d395bdc2134704"), "id": 101, "details1": [
{ "Name": "Chris", "details2": [
{ "StudentName": "David", "Subject": "MongoDB" }
]}
] }
สรุป: การใช้ Positional Operator $ ร่วมกับ $pull ช่วยให้สามารถลบรายการจากอาร์เรย์ระดับใน (Nested Array) ได้อย่างแม่นยำ โดยระบุเงื่อนไขทั้งระดับนอกและระดับใน