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

การอัปเดตเอกสาร MongoDB โดยไม่ทับซ้อนข้อมูลเดิมด้วย $set

อัปเดตเฉพาะฟิลด์ที่ต้องการด้วย $set เพื่อป้องกันการทับซ้อนข้อมูล

เมื่อใช้ update() โดยไม่มี $set MongoDB จะแทนที่เอกสารทั้งชิ้น (replace) ทำให้ฟิลด์ที่ไม่ได้ระบุใน update document จะหายไป ใช้ $set เพื่ออัปเดตเฉพาะฟิลด์ที่ต้องการเท่านั้น

ตัวอย่างข้อมูลทดสอบ

> db.demo401.insertOne({
  "_id": 1001,
  "Name": "Chris",
  "SubjectName": "MongoDB",
  "Score": 45
});

แสดงข้อมูลก่อนอัปเดต

> db.demo401.find();

ผลลัพธ์:

{ "_id": 1001, "Name": "Chris", "SubjectName": "MongoDB", "Score": 45 }

คำสั่งอัปเดตเฉพาะ Score ให้เป็น 89

> db.demo401.update({ _id: 1001 }, { $set: { Score: 89 } });

ผลลัพธ์: WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })

แสดงข้อมูลหลังอัปเดต

> db.demo401.find();

ผลลัพธ์:

{ "_id": 1001, "Name": "Chris", "SubjectName": "MongoDB", "Score": 89 }

เปรียบเทียบ: ไม่ใช้ $set (Replace entire document)

> db.demo401.update({ _id: 1001 }, { Score: 90 });

จะทำให้เอกสารเหลือแค่ { "_id": 1001, "Score": 90 } ฟิลด์ Name และ SubjectName จะหายไป!

แนวทางปฏิบัติที่ดี (Best Practice)

  • ใช้ $set เสมอเมื่อต้องการอัปเดตเฉพาะบางฟิลด์
  • ใช้ updateOne() หรือ updateMany() แทน update() แบบเก่า
  • ใช้ $inc สำหรับเพิ่ม/ลดค่าตัวเลข, $push สำหรับเพิ่มในอาร์เรย์ ฯลฯ