เมื่อต้องการเพิ่มค่า (increment) ของฟิลด์ในออบเจกต์ที่อยู่ในอาร์เรย์ ให้ใช้โอเปอเรเตอร์ $inc ร่วมกับ positional operator $
> db.demo506.insertOne({"details": [{id: 1, Quantity: 4}, {id: 2, Quantity: 3}, {id: 3, Quantity: 2}, {id: 4, Quantity: 7}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e882ed6987b6e0e9d18f576") }
แสดงข้อมูล:
> db.demo506.find().pretty();
{ "_id" : ObjectId("5e882ed6987b6e0e9d18f576"), "details" : [ { "id" : 1, "Quantity" : 4 }, { "id" : 2, "Quantity" : 3 }, { "id" : 3, "Quantity" : 2 }, { "id" : 4, "Quantity" : 7 } ] }
คิวรีเพิ่ม Quantity ของรายการที่ id = 2 ขึ้น 10
> db.demo506.update({"details.id": 2}, {$inc: {"details.$.Quantity": 10}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ตรวจสอบผลลัพธ์:
> db.demo506.find().pretty();
{ "_id" : ObjectId("5e882ed6987b6e0e9d18f576"), "details" : [ { "id" : 1, "Quantity" : 4 }, { "id" : 2, "Quantity" : 13 }, { "id" : 3, "Quantity" : 2 }, { "id" : 4, "Quantity" : 7 } ] }
คำอธิบาย
- เงื่อนไขค้นหา:
{"details.id": 2}- หาเอกสารที่มีอาร์เรย์ details ประกอบด้วยออบเจกต์ที่ id = 2 - Positional operator $: อ้างอิงถึงตำแหน่งของออบเจกต์ที่ match ในอาร์เรย์
- $inc: เพิ่มค่า Quantity ขึ้น 10 (จาก 3 เป็น 13)
ข้อควรระวัง: Positional operator $ จะอัปเดตเฉพาะ สมาชิกแรกที่ match เท่านั้น หากมีหลายรายการที่ id = 2 จะอัปเดตแค่ตัวแรก