เพื่ออัปเดตออบเจ็กต์ภายใน Array ต่อยอด (Nested Array) ใช้เมธอด update() ร่วมกับ Positional Operator $ และ $inc
สร้างคอลเล็กชันพร้อม Nested Array
> db.updateObjects.insertOne({
"CustomerId": 1,
"CustomerName": "Larry",
"TotalItems": 100,
"ItemDetails": [
{"NameOfItem": "Item_1", "Amount": 450},
{"NameOfItem": "Item_2", "Amount": 500},
{"NameOfItem": "Item_3", "Amount": 200}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c6d688b0c3d5054b766a769") }
แสดงเอกสาร
> db.updateObjects.find().pretty();
Increment Amount ของ Item_3 เพิ่ม 130 (จาก 200 เป็น 330)
> db.updateObjects.update(
{"CustomerId": 1, "ItemDetails.NameOfItem": "Item_3"},
{$inc: {"ItemDetails.$.Amount": 130}},
false, true
);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
$ (Positional Operator) อ้างอิงถึงตำแหน่งของ Element ใน Array ที่ Match เงื่อนไข ItemDetails.NameOfItem: "Item_3"
ตรวจสอบผลลัพธ์
> db.updateObjects.find().pretty();
{
"CustomerId" : 1,
"CustomerName" : "Larry",
"TotalItems" : 100,
"ItemDetails" : [
{"NameOfItem" : "Item_1", "Amount" : 450},
{"NameOfItem" : "Item_2", "Amount" : 500},
{"NameOfItem" : "Item_3", "Amount" : 330} // เพิ่มขึ้น 130
]
}
อัปเดตสำเร็จ: Amount ของ Item_3 จาก 200 กลายเป็น 330