Cập nhật hàng loạt document theo danh sách _id với updateMany()
updateMany() cập nhật tất cả document khớp filter. Kết hợp với $in để cập nhật nhiều _id cùng lúc.
1. Dữ liệu mẫu
> db.demo476.insertOne({ _id: 1, Name: "Chris" });
> db.demo476.insertOne({ _id: 2, Name: "David" });
> db.demo476.insertOne({ _id: 3, Name: "Bob" });
> db.demo476.insertOne({ _id: 4, Name: "Carol" });
2. Cập nhật _id 1 và 3: Name → "Robert"
> db.demo476.updateMany(
{ _id: { $in: [1, 3] } },
{ $set: { Name: "Robert" } }
);
{ "acknowledged": true, "matchedCount": 2, "modifiedCount": 2 }
3. Kết quả
> db.demo476.find();
{ "_id": 1, "Name": "Robert" }
{ "_id": 2, "Name": "David" }
{ "_id": 3, "Name": "Robert" }
{ "_id": 4, "Name": "Carol" }
Các pattern filter thường dùng với updateMany
| Filter | Mô tả |
|---|---|
| { _id: { $in: [1,3,5] } } | Cập nhật danh sách ID cụ thể |
| { status: "pending" } | Cập nhật tất cả trạng thái pending |
| { createdAt: { $lt: ISODate("2024-01-01") } } | Cập nhật document cũ hơn ngày X |
| { $or: [{type: "A"}, {type: "B"}] } | Cập nhật nhiều loại |
| { tags: { $in: ["vip", "premium"] } } | Cập nhật có tag đặc biệt |
Lưu ý quan trọng
- Atomic per document: Mỗi document cập nhật atomic, nhưng toàn bộ operation không atomic
- matchedCount vs modifiedCount: matched = số doc khớp filter, modified = số doc thực sự thay đổi giá trị
- Không có rollback: Nếu lỗi giữa chừng, các doc đã cập nhật không tự revert
- Write Concern: Mặc định w:1 (acknowledged). Có thể tăng w: "majority" cho an toàn
Ví dụ an toàn với write concern
db.demo476.updateMany(
{ _id: { $in: [1, 3] } },
{ $set: { Name: "Robert", updatedAt: new Date() } },
{ writeConcern: { w: "majority", wtimeout: 5000 } }
);
So sánh updateOne vs updateMany vs replaceMany
// updateOne: Chỉ 1 doc (đầu tiên khớp)
db.coll.updateOne(filter, update);
// updateMany: TẤT CẢ doc khớp
db.coll.updateMany(filter, update);
// replaceMany: KHÔNG CÓ. Chỉ có replaceOne.
// Muốn replace nhiều → dùng updateMany với $set toàn bộ field (không khuyến khích)