ใช้ 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 ลบฟิลด์ทิ้ง