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

การลบรายการเฉพาะจากอาร์เรย์ซ้อนในอีกอาร์เรย์หนึ่งใน MongoDB

ลบรายการจาก 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) ได้อย่างแม่นยำ โดยระบุเงื่อนไขทั้งระดับนอกและระดับใน