เมื่อต้องการอัปเดตเอกสาร "ล่าสุด" (latest) ที่ตรงตามเงื่อนไข ให้ใช้ findAndModify() ร่วมกับ sort ตาม _id ลำดับถอยหลัง
> db.demo516.insertOne({"Name": "John", "Age": 22, "Score": 56});
{ "acknowledged" : true, "insertedId" : ObjectId("5e889fdb987b6e0e9d18f591") }
> db.demo516.insertOne({"Name": "John", "Age": 23, "Score": 67});
{ "acknowledged" : true, "insertedId" : ObjectId("5e889ff1987b6e0e9d18f592") }
> db.demo516.insertOne({"Name": "John", "Age": 22, "Score": 56});
{ "acknowledged" : true, "insertedId" : ObjectId("5e889ff3987b6e0e9d18f593") }
> db.demo516.insertOne({"Name": "John", "Age": 22, "Score": 66});
{ "acknowledged" : true, "insertedId" : ObjectId("5e889ffa987b6e0e9d18f594") }
แสดงข้อมูล (มี John อายุ 22 อยู่ 3 รายการ):
> db.demo516.find();
{ "_id" : ObjectId("5e889fdb987b6e0e9d18f591"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ff1987b6e0e9d18f592"), "Name" : "John", "Age" : 23, "Score" : 67 }
{ "_id" : ObjectId("5e889ff3987b6e0e9d18f593"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ffa987b6e0e9d18f594"), "Name" : "John", "Age" : 22, "Score" : 66 }
คิวรีอัปเดตเอกสารล่าสุดที่ Name="John" และ Age=22
> db.demo516.findAndModify({
... query: {Name: "John", Age: 22},
... sort: {_id: -1},
... update: {$set: {Score: 98}},
... new: true
... });
{ "_id" : ObjectId("5e889ffa987b6e0e9d18f594"), "Name" : "John", "Age" : 22, "Score" : 98 }
ตรวจสอบหลังอัปเดต (เฉพาะรายการล่าสุด _id ...594 ที่เปลี่ยน Score เป็น 98):
> db.demo516.find();
{ "_id" : ObjectId("5e889fdb987b6e0e9d18f591"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ff1987b6e0e9d18f592"), "Name" : "John", "Age" : 23, "Score" : 67 }
{ "_id" : ObjectId("5e889ff3987b6e0e9d18f593"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ffa987b6e0e9d18f594"), "Name" : "John", "Age" : 22, "Score" : 98 }
คำอธิบายพารามิเตอร์
- query: เงื่อนไขค้นหา
- sort: {_id: -1}: เรียง _id ใหม่สุดก่อน (ObjectId มี timestamp อยู่ในตัว)
- update: การอัปเดตที่ต้องการ ($set, $inc, etc.)
- new: true: คืนค่าเอกสารหลังอัปเดต (default false คืนค่าก่อนอัปเดต)
หมายเหตุ: findAndModify ถูกแทนที่ด้วย findOneAndUpdate() ใน driver ใหม่们