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

อัปเดต Array ด้วยหลายเงื่อนไขใน MongoDB

การอัปเดต array element ที่ตรงกับหลายเงื่อนไข (multiple conditions) ใช้ updateOne() ร่วมกับ $elemMatch ใน filter และ $push เพื่อเพิ่มข้อมูลเข้า array ย่อย

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.demo94.insertOne({
...   "Details" : [
...     { "Name" : "Chris", "Subject" : [] },
...     { "Name" : "David", "Subject" : [] },
...     { "Name" : "Bob", "Subject" : [] }
...   ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d553bb8903cdd865577a9") }

แสดงข้อมูลก่อนอัปเดต

> db.demo94.find();

ผลลัพธ์: ทุก element ใน Details มี Subject เป็น array ว่าง

Query อัปเดต Array ด้วยหลายเงื่อนไข

> db.demo94.updateOne(
... {
...   "Details": { "$elemMatch": { "Name": "David" } }
... },
... {
...   "$push": { "Details.$.Subject": { "Subject": "MongoDB" } }
... }
...);
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

คำอธิบาย:

  • $elemMatch: { "Name": "David" }: ระบุเงื่อนไขค้นหา element ใน array Details
  • $push: { "Details.$.Subject": {...} }: เพิ่ม object เข้าไปใน array Subject ของ element ที่ match (ใช้ positional $)
  • updateOne: อัปเดตเฉพาะเอกสารแรกที่ตรงเงื่อนไข

ผลลัพธ์หลังอัปเดต

> db.demo94.find();

ผลลัพธ์:

{ "_id" : ObjectId("5e2d553bb8903cdd865577a9"), "Details" : [
  { "Name" : "Chris", "Subject" : [ ] },
  { "Name" : "David", "Subject" : [ { "Subject" : "MongoDB" } ] },
  { "Name" : "Bob", "Subject" : [ ] }
] }

เฉพาะ David ที่ได้ Subject เพิ่มเข้าไป

กรณีอัปเดตหลายเงื่อนไขใน element เดียว

หากต้องการ match หลาย field ใน element เดียวกัน:

db.demo94.updateOne(
  { "Details": { $elemMatch: { "Name": "David", "Age": 25 } } },
  { $push: { "Details.$.Subject": "MongoDB" } }
)

อัปเดตหลาย Element พร้อมกัน (MongoDB 3.6+)

ใช้ arrayFilters แทน positional $:

db.demo94.updateMany(
  {},
  { $push: { "Details.$[elem].Subject": "MongoDB" } },
  { arrayFilters: [ { "elem.Name": { $in: ["David", "Bob"] } } ] }
)

สรุป: $elemMatch ใน filter + positional $ ใน update = อัปเดต array element เป้าหมายได้แม่นยำ