ใช้ update() พร้อม Positional $ Operator สำหรับ Tag
เมื่อ tags เก็บเป็นอาร์เรย์ของออบเจ็กต์ ใช้ dot notation และ positional $ เพื่ออัปเดต tag เฉพาะ id
ตัวอย่างข้อมูล
> db.demo713.insertOne({
tags: [
{ id: 101, Name: "Tag-1" },
{ id: 102, Name: "Tag-3" },
{ id: 103, Name: "Tag-3" }
]
});
Query อัปเดต Tag id=102 เป็น Tag-2
> db.demo713.update({ "tags.id": 102 }, { $set: { "tags.$.Name": "Tag-2" } }, false, true);
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
ผลลัพธ์
{ "_id": ObjectId(...), "tags": [
{ "id": 101, "Name": "Tag-1" },
{ "id": 102, "Name": "Tag-2" },
{ "id": 103, "Name": "Tag-3" }
] }
คำอธิบายพารามิเตอร์ update()
{ "tags.id": 102 }- Query filter หาเอกสารที่มี tags.id = 102{ $set: { "tags.$.Name": "Tag-2" } }- อัปเดต Name ของอิลิเมนต์ที่ match ($ = positional)false- upsert: false (ไม่ insert ใหม่ถ้าไม่เจอ)true- multi: true (อัปเดตทุกเอกสารที่ match)
รูปแบบใหม่ (MongoDB 3.2+)
// อัปเดตเอกสารเดียว (multi: false default)
db.demo713.updateOne({ "tags.id": 102 }, { $set: { "tags.$.Name": "Tag-2" } });
// อัปเดตหลายเอกสาร
db.demo713.updateMany({ "tags.id": 102 }, { $set: { "tags.$.Name": "Tag-2" } });
ArrayFilters สำหรับเงื่อนไขซับซ้อน (MongoDB 3.6+)
db.demo713.updateMany(
{},
{ $set: { "tags.$[elem].Name": "Tag-2" } },
{ arrayFilters: [{ "elem.id": 102 }] }
);
กรณี Tag ซ้ำ (Multiple matches)
ในตัวอย่างมี Tag-3 สองอิลิเมนต์ (id: 102, 103) positional $ จะอัปเดต **อิลิเมนต์แรกที่ match เท่านั้น** (id: 102) หากต้องการอัปเดตทุกอิลิเมนต์ที่ match ให้ใช้ arrayFilters กับ $[]