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

วิธีล้างข้อมูลใน Nested Array ของ MongoDB ด้วย $set

ใช้ operator $set กำหนดค่าให้อาร์เรย์เป็นค่าว่าง [] เพื่อล้างข้อมูลใน Nested Array ทั้งหมด

รูปแบบคำสั่ง

db.collection.update(
    { query },
    { $set: { "nestedArrayField": [] } }
);

ตัวอย่าง: Nested Array 2 ระดับ

1. สร้างข้อมูลตัวอย่าง

> db.clearingItemsInNestedArrayDemo.insertOne({
    "StudentName": "John",
    "StudentDetails": [
        {
            "ProjectName": "Online Banking",
            "ProjectDetails": [
                { "TechnologyUsed": "Java", "TeamSize": 5 }
            ]
        }
    ]
});

2. แสดงข้อมูลก่อนล้าง

> db.clearingItemsInNestedArrayDemo.find().pretty();
{ 
    "_id" : ObjectId("..."), 
    "StudentName" : "John", 
    "StudentDetails" : [ 
        { 
            "ProjectName" : "Online Banking", 
            "ProjectDetails" : [ 
                { "TechnologyUsed" : "Java", "TeamSize" : 5 }
            ]
        }
    ]
}

3. ล้างอาร์เรย์ StudentDetails (ตั้งค่าเป็น [])

> db.clearingItemsInNestedArrayDemo.update(
    { "StudentName": "John" },
    { $set: { "StudentDetails": [] } }
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

4. ตรวจสอบหลังล้าง

> db.clearingItemsInNestedArrayDemo.find().pretty();
{ 
    "_id" : ObjectId("..."), 
    "StudentName" : "John", 
    "StudentDetails" : [ ] 
}

กรณี: ล้างเฉพาะ Nested Array ภายใน (ProjectDetails)

ต้องใช้ positional operator $ หรือ $[] (MongoDB 3.6+)

// ล้าง ProjectDetails ของทุก element ใน StudentDetails
db.collection.update(
    { "StudentName": "John" },
    { $set: { "StudentDetails.$[].ProjectDetails": [] } }
);

Operator เกี่ยวข้อง

Operatorหน้าที่
$setตั้งค่าฟิลด์ (รวมถึงแทนที่อาร์เรย์ทั้งหมด)
$unsetลบฟิลด์ออกไปเลย
$pullลบ element เฉพาะในอาร์เรย์ตามเงื่อนไข
$[]All positional operator - ทุก element ในอาร์เรย์

สรุป

  • ใช้ $set: { "arrayField": [] } เพื่อล้างอาร์เรย์ระดับบนสุด
  • ใช้ $set: { "outerArray.$[].innerArray": [] } เพื่อล้าง nested array ทุกตัว
  • $unset จะลบฟิลด์ออกไปเลย (ไม่เหลือฟิลด์)
  • เลือกวิธีตามต้องการ: คงฟิลด์ไว้แต่อาร์เรย์ว่าง vs ลบฟิลด์ทิ้ง