อัปเดตเฉพาะฟิลด์ที่ต้องการด้วย $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 สำหรับเพิ่มในอาร์เรย์ ฯลฯ