Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

อัปเดตเอกสารล่าสุดที่ตรงเงื่อนไขใน MongoDB ด้วย findAndModify

เมื่อต้องการอัปเดตเอกสาร "ล่าสุด" (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 ใหม่们