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

วิธี исключить ค่าฟิลด์ประเภทอาร์เรย์ใน MongoDB


ใช้ 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": [{ }, { }] }

คำอธิบายโค้ด

  1. find({ id: "101" }) - หาเอกสารเป้าหมาย
  2. forEach() - วนลูปแต่ละเอกสาร (cursor method)
  3. delete array["Name"] - ลบ property Name จากออบเจ็กต์ (JavaScript delete operator)
  4. save() - บันทึกเอกสารกลับ (upsert: update หรือ insert)
  5. วิธีสมัยใหม่กว่า (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

    • Atomic - ทำใน operation เดียว
    • ไม่ต้อง fetch-modify-save (ป้องกัน race condition)
    • ใช้ $map, $mergeObjects, $$REMOVE แปลงข้อมูลได้ยืดหยุ่น

    หมายเหตุ

    วิธี forEach + delete + save ใช้ได้เฉพาะใน MongoDB Shell ไม่สามารถใช้ใน Driver/Application ได้โดยตรง