findOneAndUpdate() ใช้สำหรับอัปเดตและคืนค่าเอกสารเดี่ยวตามเงื่อนไข filter และ sort criteria ไวยากรณ์: db.collection.findOneAndUpdate(filter, update, options) สร้างคอลเลกชันตัวอย่าง:
> db.demo328.insertOne({Name:"Chris",Marks:67});
{ "acknowledged" : true, "insertedId" : ObjectId("5e516b19f8647eb59e56207a") }
> db.demo328.insertOne({Name:"David",Marks:78});
{ "acknowledged" : true, "insertedId" : ObjectId("5e516b24f8647eb59e56207b") }
> db.demo328.insertOne({Name:"Bob",Marks:97});
{ "acknowledged" : true, "insertedId" : ObjectId("5e516b2bf8647eb59e56207c") }
แสดงข้อมูล:
> db.demo328.find();
เพิ่ม Marks 10 ให้คนชื่อ David (คืนค่าเอกสาร ก่อน อัปเดต):
> db.demo328.findOneAndUpdate({Name:"David"},{ $inc: { "Marks" : 10} });
{ "_id" : ObjectId("5e516b24f8647eb59e56207b"), "Name" : "David", "Marks" : 78 }
ตรวจสอบข้อมูลหลังอัปเดต:
> db.demo328.find();
ผลลัพธ์ (Marks ของ David กลายเป็น 88):
{ "_id" : ObjectId("5e516b19f8647eb59e56207a"), "Name" : "Chris", "Marks" : 67 }
{ "_id" : ObjectId("5e516b24f8647eb59e56207b"), "Name" : "David", "Marks" : 88 }
{ "_id" : ObjectId("5e516b2bf8647eb59e56207c"), "Name" : "Bob", "Marks" : 97 }
ตัวเลือกสำคัญ (options)
returnDocument:"before"(default) หรือ"after"- คืนค่าก่อน/หลังอัปเดตupsert: true/false - สร้างเอกสารใหม่หากไม่พบsort: เรียงลำดับก่อนเลือกเอกสาร (หากมีหลายตัวตรงเงื่อนไข)projection: จำกัดฟิลด์ที่คืนค่า
แตกต่างจาก updateOne()
findOneAndUpdate() คืนค่าเอกสาร (before/after) ส่วน updateOne() คืนค่า WriteResult เท่านั้น เหมาะสำหรับ atomic read-modify-write operations