findOneAndUpdate() อัปเดตและคืนค่าเอกสารเดี่ยว (atomic) สร้างคอลเลกชันตัวอย่าง:
db.demo349.insertOne({"Name":"Chris","Marks":56});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55384af8647eb59e5620b4") }
> db.demo349.insertOne({"Name":"David","Marks":78});
{ "acknowledged" : true, "insertedId" : ObjectId("5e553853f8647eb59e5620b5") }
> db.demo349.insertOne({"Name":"Chris","Marks":89});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55385af8647eb59e5620b6") }
> db.demo349.insertOne({"Name":"David","Marks":54});
{ "acknowledged" : true, "insertedId" : ObjectId("5e55385ff8647eb59e5620b7") }
แสดงข้อมูล (มี Chris 2 คน, David 2 คน):
> db.demo349.find();
อัปเดตคนชื่อ David คนแรก (ตามลำดับ _id) เพิ่ม Marks 10:
> db.demo349.findOneAndUpdate({ "Name" : "David" },{$inc:{Marks:10}});
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 78 }
ตรวจสอบข้อมูลหลังอัปเดต:
> db.demo349.find();
ผลลัพธ์ (David คนแรก Marks กลายเป็น 88):
{ "_id" : ObjectId("5e55384af8647eb59e5620b4"), "Name" : "Chris", "Marks" : 56 }
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 88 }
{ "_id" : ObjectId("5e55385af8647eb59e5620b6"), "Name" : "Chris", "Marks" : 89 }
{ "_id" : ObjectId("5e55385ff8647eb59e5620b7"), "Name" : "David", "Marks" : 54 }
พฤติกรรมสำคัญ
- คืนค่าเอกสาร ก่อน อัปเดต (default: returnDocument: "before")
- อัปเดต เอกสารแรก ที่ match ตามลำดับ natural order (หรือ sort order) ใช้
- Atomic operation: อ่านและเขียนในขั้นตอนเดียว ไม่มี race condition
- เหมาะสำหรับ: คิวงาน (job queue), นับจำนวน (counter), locking pattern
sort: {_id: 1} ใน options เพื่อระบุลำดับชัดเจน