ใช้ updateOne() พร้อม Positional $ Operator
เมื่อต้องการอัปเดตเฉพาะอิลิเมนต์ในอาร์เรย์ที่ตรงเงื่อนไข ให้ใช้ $ (positional operator) ร่วมกับ $set ใน updateOne()
ตัวอย่างข้อมูล
> db.demo462.insertOne({
"id": 1,
"DueDateDetails": [
{ "Name": "David", "Age": 21, "CountryName": ["US", "UK"] },
{ "Name": "Chris", "Age": 23, "CountryName": ["UK"] }
]
});
Query อัปเดต CountryName ของ Chris เป็น AUS
> db.demo462.updateOne(
{ id: 1, "DueDateDetails.Name": "Chris" },
{ $set: { "DueDateDetails.$.CountryName": "AUS" } }
);
{ "acknowledged": true, "matchedCount": 1, "modifiedCount": 1 }
ผลลัพธ์
{ "_id": ObjectId(...), "id": 1, "DueDateDetails": [
{ "Name": "David", "Age": 21, "CountryName": ["US", "UK"] },
{ "Name": "Chris", "Age": 23, "CountryName": "AUS" }
] }
คำอธิบาย Positional $ Operator
DueDateDetails.$- อ้างอิงอิลิเมนต์ **แรกที่ match** ในอาร์เรย์ DueDateDetails- เงื่อนไข match มาจาก query:
"DueDateDetails.Name": "Chris" - อัปเดตเฉพาะอิลิเมนต์ที่ match ไม่กระทบอิลิเมนต์อื่น
ข้อจำกัด
- อัปเดตได้เพียง **อิลิเมนต์แรกที่ match** เท่านั้น
- ไม่รองรับการอัปเดตหลายตำแหน่งพร้อมกัน
- ไม่ทำงานกับ nested array (อาร์เรย์ในอาร์เรย์)
ทางเลือกสำหรับหลายตำแหน่ง (MongoDB 3.6+)
// ใช้ $[] (all positional) อัปเดตทุกอิลิเมนต์
db.demo462.updateOne(
{ id: 1 },
{ $set: { "DueDateDetails.$[elem].CountryName": "AUS" } },
{ arrayFilters: [{ "elem.Name": "Chris" }] }
);
// ใช้ $[] กับ arrayFilters สำหรับเงื่อนไขซับซ้อน
Filter Array Elements (MongoDB 3.6+)
arrayFilters ช่วยให้ระบุเงื่อนไขสำหรับ positional operator ได้ชัดเจนและยืดหยุ่นกว่า