ไม่สามารถอัปเดตข้อมูลโดยตรงใน Aggregation Pipeline ได้ ต้องใช้ update() แยกต่างหาก ร่วมกับ arrayFilters สำหรับอัปเดตเฉพาะองค์ประกอบในอาร์เรย์
ตัวอย่างข้อมูลทดสอบ
> db.demo376.insertOne({
"id" : 101,
"details" : [
{"Name":"Chris", "Age":21, "Score":45},
{"Name":"David", "Age":23, "Score":67},
{"Name":"Bob", "Age":20, "Score":54}
]
});
แสดงข้อมูลก่อน
> db.demo376.find().pretty();
{
"_id" : ObjectId("5e5a71b92ae06a1609a00b0d"),
"id" : 101,
"details" : [
{"Name" : "Chris", "Age" : 21, "Score" : 45},
{"Name" : "David", "Age" : 23, "Score" : 67},
{"Name" : "Bob", "Age" : 20, "Score" : 54}
]
}
คำสั่งอัปเดต Age +3 เฉพาะที่ Age=21 และ Score>40
> db.demo376.update(
{"id" : 101},
{$inc: {"details.$[d].Age": 3}},
{arrayFilters: [{$and: [{"d.Age": 21}, {"d.Score": {$gt: 40}}]}]}
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
ผลลัพธ์ (Chris อายุ 21 -> 24)
> db.demo376.find().pretty();
{
"_id" : ObjectId("5e5a71b92ae06a1609a00b0d"),
"id" : 101,
"details" : [
{"Name" : "Chris", "Age" : 24, "Score" : 45},
{"Name" : "David", "Age" : 23, "Score" : 67},
{"Name" : "Bob", "Age" : 20, "Score" : 54}
]
}
สรุป: Aggregation ใช้สำหรับอ่าน/คำนวณเท่านั้น การเขียนข้อมูลต้องใช้ update() พร้อม arrayFilters เพื่อระบุเงื่อนไของค์ประกอบในอาร์เรย์