Method findAndModify() (หรือ findOneAndUpdate() ในเวอร์ชันใหม่) ใช้สำหรับ Atomic Read-Modify-Write เนื้อหานี้สาธิตการอัปเดต Element ใน Array Name ที่ Match เงื่อนไข โดยใช้ Positional Operator $ ร่วมกับ $set และ $inc
ตัวอย่างข้อมูลทดสอบ
> db.demo152.insertOne({"id":102,"Name":["Chris","David"],"Score":45});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3515bcfdf09dd6d08539dd") }
> db.demo152.insertOne({"id":103,"Name":["Mike","Carol"],"Score":65});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3515cafdf09dd6d08539de") }
แสดงข้อมูลเดิม
> db.demo152.find();
{
"_id" : ObjectId("5e3515bcfdf09dd6d08539dd"),
"id" : 102,
"Name" : [ "Chris", "David" ],
"Score" : 45
}
{
"_id" : ObjectId("5e3515cafdf09dd6d08539de"),
"id" : 103,
"Name" : [ "Mike", "Carol" ],
"Score" : 65
}
Query findAndModify อัปเดต Array
> var d = db.demo152.findAndModify({
query: {
id: 102,
Score: {$lt: 50},
Name: "Chris"
},
update: {
$set: { "Name.$": "Robert" },
$inc: { Score: 20 }
}
});
ผลลัพธ์หลังอัปเดต
> db.demo152.find();
{
"_id" : ObjectId("5e3515bcfdf09dd6d08539dd"),
"id" : 102,
"Name" : [ "Robert", "David" ],
"Score" : 65
}
{
"_id" : ObjectId("5e3515cafdf09dd6d08539de"),
"id" : 103,
"Name" : [ "Mike", "Carol" ],
"Score" : 65
}
คำอธิบาย
query: เงื่อนไขค้นหา - id=102, Score<50, และ Array Name มี "Chris"$set: { "Name.$": "Robert" }:$(Positional Operator) อ้างอิง Element แรกที่ Match ใน Array Name (คือ "Chris") และเปลี่ยนเป็น "Robert"$inc: { Score: 20 }: เพิ่ม Score ขึ้น 20 (45 → 65)findAndModifyคืนค่าเอกสาร ก่อนอัปเดต (Default) - ใช้new: trueเพื่อคืนค่าหลังอัปเดต- MongoDB 3.2+ แนะนำใช้
findOneAndUpdate()แทน ซึ่งมี Syntax ชัดเจนกว่า