Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Upsert mảng với nhiều điều kiện trong MongoDB dùng bulkWrite

Phương thức bulkWrite() cho phép thực hiện nhiều thao tác write (insert/update/delete) trong một lần, hỗ trợ logic upsert phức tạp cho mảng.

Dữ liệu mẫu

> db.demo105.insertOne({ 
    _id:'101', Name:'Chris', 
    Details:[
        { Marks1:60, Marks2:70, Marks3:70 }, 
        { Marks1:70, Marks2:70, Marks3:90 }
    ] 
});
{ "acknowledged" : true, "insertedId" : "101" }

BulkWrite với 3 operations

> db.demo105.bulkWrite([
    // 1. Update nếu tìm thấy phần tử Marks2=70, Marks3=70
    { "updateOne": {
        "filter": { "_id": "101", "Details": { "$elemMatch": { Marks2: 70, Marks3: 70 } } },
        "update": { "$set": { "Details.$.Marks3": 96 } }
    }},
    // 2. Push mới nếu KHÔNG tìm thấy phần tử Marks2=70, Marks3=70
    { "updateOne": {
        "filter": { "_id": "101", "Details": { "$not": { "$elemMatch": { Marks2: 70, Marks3: 70 } } } },
        "update": { "$push": { "Details": { Marks1: 94, Marks2: 97, Marks3: 99 } } }
    }},
    // 3. Upsert document nếu _id=101 không tồn tại
    { "updateOne": {
        "filter": { "_id": 101 },
        "update": { "$setOnInsert": { "Details": [ { Marks1: 34, Marks2: 67, Marks3: 87 } ] } },
        "upsert": true
    }}
]);

Kết quả

{ "acknowledged" : true, "deletedCount" : 0, "insertedCount" : 0, "matchedCount" : 2, "upsertedCount" : 1, "insertedIds" : {}, "upsertedIds" : { "2" : 101 } }

Giải thích 3 operation:

  1. Cập nhật Marks3=96 cho phần tử khớp Marks2=70, Marks3=70 (positional $)
  2. Thêm phần tử mới nếu không có phần tử nào khớp điều kiện (logic ELSE)
  3. Upsert document gốc nếu _id không tồn tại (INSERT IF NOT EXISTS)

bulkWrite thực hiện atomic tại mức operation (không phải transaction toàn bộ batch).