อัปเดตองค์ประกอบเฉพาะในอาร์เรย์ด้วย Positional $ Operator
เมื่อต้องการอัปเดตเฉพาะองค์ประกอบในอาร์เรย์ที่ตรงตามเงื่อนไข ใช้ Positional $ Operator ซึ่งจะอ้างอิงถึงตำแหน่งขององค์ประกอบที่ match กับ query condition
ตัวอย่างข้อมูลทดสอบ
> db.demo49.insertOne({
"Name": "David",
"Details": [
{ "_id": "D1234", "Subject": "MySQL" },
{ "_id": "E234", "Subject": "Java" },
{ "_id": "F456", "Subject": "Python" }
]
});
แสดงข้อมูลก่อนอัปเดต
> db.demo49.find();
ผลลัพธ์:
{
"_id": ObjectId("5e270a77cfb11e5c34d89902"),
"Name": "David",
"Details": [
{ "_id": "D1234", "Subject": "MySQL" },
{ "_id": "E234", "Subject": "Java" },
{ "_id": "F456", "Subject": "Python" }
]
}
คำสั่งอัปเดต Subject ของ Details ที่ _id เป็น E234
> db.demo49.update(
{ "Details._id": "E234" },
{ $set: { "Details.$.Subject": "MongoDB" } },
false,
true
);
ผลลัพธ์: WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
แสดงข้อมูลหลังอัปเดต
> db.demo49.find();
ผลลัพธ์:
{
"_id": ObjectId("5e270a77cfb11e5c34d89902"),
"Name": "David",
"Details": [
{ "_id": "D1234", "Subject": "MySQL" },
{ "_id": "E234", "Subject": "MongoDB" },
{ "_id": "F456", "Subject": "Python" }
]
}
คำอธิบาย
- { "Details._id": "E234" }: ค้นหาเอกสารที่มีอาร์เรย์ Details ประกอบด้วยองค์ประกอบที่ _id = "E234"
- Details.$.Subject: ตัวดำเนินการ $ จะชี้ไปที่องค์ประกอบแรกที่ match ในอาร์เรย์ Details
- false, true: พารามิเตอร์ upsert=false, multi=true (รูปแบบเก่า)
รูปแบบใหม่ (แนะนำ): ใช้ updateOne() หรือ updateMany() แทน update()