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

อัปเดตข้อมูลหลัง Aggregation ใน MongoDB

ไม่สามารถอัปเดตข้อมูลโดยตรงใน 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 เพื่อระบุเงื่อนไของค์ประกอบในอาร์เรย์