ใช้ JavaScript forEach และ delete() ใน MongoDB Shell
MongoDB ไม่มี operator ตรงๆ สำหรับลบฟิลด์ออกจากทุกอิลิเมนต์ในอาร์เรย์ ต้องใช้ JavaScript ใน shell วนลูปลบแต่ละอิลิเมนต์
ตัวอย่างข้อมูล
> db.demo464.insertOne({ "id": "101", "details": [{ "Name": "Chris" }, { "Name": "David" }] });
Query ลบฟิลด์ Name จากทุกอิลิเมนต์ใน details
> db.demo464.find({ id: "101" }).forEach(function(mongoDocument) {
var details = mongoDocument.details;
for (var j = 0; j < details.length; ++j) {
var array = details[j];
delete array["Name"];
}
db.demo464.save(mongoDocument);
});
ผลลัพธ์
{ "_id": ObjectId(...), "id": "101", "details": [{ }, { }] }
คำอธิบายโค้ด
find({ id: "101" })- หาเอกสารเป้าหมายforEach()- วนลูปแต่ละเอกสาร (cursor method)delete array["Name"]- ลบ property Name จากออบเจ็กต์ (JavaScript delete operator)save()- บันทึกเอกสารกลับ (upsert: update หรือ insert)- Atomic - ทำใน operation เดียว
- ไม่ต้อง fetch-modify-save (ป้องกัน race condition)
- ใช้ $map, $mergeObjects, $$REMOVE แปลงข้อมูลได้ยืดหยุ่น
วิธีสมัยใหม่กว่า (MongoDB 4.2+)
// ใช้ aggregation pipeline ใน update (atomic, ไม่ต้อง round-trip)
db.demo464.updateMany(
{ id: "101" },
[{ $set: { details: { $map: { input: "$details", as: "d", in: { $mergeObjects: ["$$d", { Name: "$$REMOVE" }] } } } }]
);
ข้อดีของ Pipeline Update
หมายเหตุ
วิธี forEach + delete + save ใช้ได้เฉพาะใน MongoDB Shell ไม่สามารถใช้ใน Driver/Application ได้โดยตรง