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

MongoDB Query: อัปเดต Tag ในอาร์เรย์


ใช้ 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 กับ $[]