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

MongoDB อัปเดต Array ด้วย findAndModify() และ Positional Operator $

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 ชัดเจนกว่า