อัปเดตเอกสารเฉพาะรายการด้วย update() และ $set
ใช้คำสั่ง update() (หรือ updateOne() ในรูปแบบใหม่) ร่วมกับ $set เพื่อเปลี่ยนแปลงค่าของฟิลด์เฉพาะในเอกสารที่ตรงตามเงื่อนไข
ตัวอย่างข้อมูลทดสอบ
> db.demo427.insertOne({ "StudentId": 101, "StudentName": "Chris Brown" });
> db.demo427.insertOne({ "StudentId": 102, "StudentName": "David Miller" });
> db.demo427.insertOne({ "StudentId": 103, "StudentName": "John Smith" });
> db.demo427.insertOne({ "StudentId": 104, "StudentName": "Carol Taylor" });
แสดงข้อมูลก่อนอัปเดต
> db.demo427.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "StudentId": 101, "StudentName": "Chris Brown" }
{ "_id": ObjectId("..."), "StudentId": 102, "StudentName": "David Miller" }
{ "_id": ObjectId("..."), "StudentId": 103, "StudentName": "John Smith" }
{ "_id": ObjectId("..."), "StudentId": 104, "StudentName": "Carol Taylor" }
คำสั่งอัปเดต StudentName ของ StudentId 102
> db.demo427.update({ "StudentId": 102 }, { $set: { "StudentName": "John Doe" } });
ผลลัพธ์: WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
แสดงข้อมูลหลังอัปเดต
> db.demo427.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "StudentId": 101, "StudentName": "Chris Brown" }
{ "_id": ObjectId("..."), "StudentId": 102, "StudentName": "John Doe" }
{ "_id": ObjectId("..."), "StudentId": 103, "StudentName": "John Smith" }
{ "_id": ObjectId("..."), "StudentId": 104, "StudentName": "Carol Taylor" }
คำอธิบาย
- Filter: { "StudentId": 102 }: ระบุเอกสารที่ต้องการอัปเดต (ควรใช้ฟิลด์ Unique)
- Update: { $set: { "StudentName": "John Doe" } }: เปลี่ยนแปลงเฉพาะ StudentName
- ฟิลด์อื่นๆ (StudentId, _id) คงค่าเดิม
รูปแบบใหม่ที่แนะนำ (MongoDB 3.2+)
> db.demo427.updateOne(
{ "StudentId": 102 },
{ $set: { "StudentName": "John Doe" } }
);
- updateOne(): อัปเดตสูงสุด 1 เอกสาร (ชัดเจนกว่า update() ที่อาจ multi)
- updateMany(): อัปเดตทุกเอกสารที่ match
- replaceOne(): แทนที่เอกสารทั้งชิ้น (ไม่ต้องใช้ $set)
Best Practices
- ใช้ Unique Field (เช่น _id, StudentId) ใน Filter เพื่อความแม่นยำ
- ใช้ $set เสมอเพื่อป้องกันการทับซ้อนฟิลด์อื่น
- ตรวจสอบ nMatched และ nModified ในผลลัพธ์