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:
- Cập nhật Marks3=96 cho phần tử khớp Marks2=70, Marks3=70 (positional $)
- 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)
- 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).