การอัปเดต 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 เป้าหมายได้แม่นยำ