Phương thức updateMany() (MongoDB 3.2+) cập nhật **tất cả** document khớp với filter. Dùng filter rỗng {} để cập nhật toàn bộ collection.
Cú pháp
db.collection.updateMany(
{ }, // {} = tất cả document
{ : { ... } },
{ upsert: false, writeConcern: ..., collation: ... } // options
)
Ví dụ: Đổi tên trường (Rename Field) cho tất cả document
Tạo collection updateManyDocumentsDemo:
> db.updateManyDocumentsDemo.insertOne({ "StudentName": "John", "StudentLastName": "Smith" });
> db.updateManyDocumentsDemo.insertOne({ "StudentName": "John", "StudentLastName": "Doe" });
> db.updateManyDocumentsDemo.insertOne({ "StudentName": "Carol", "StudentLastName": "Taylor" });
> db.updateManyDocumentsDemo.insertOne({ "StudentName": "David", "StudentLastName": "Miller" });
Hiển thị:
> db.updateManyDocumentsDemo.find().pretty();
Kết quả:
{ "_id" : ..., "StudentName" : "John", "StudentLastName" : "Smith" }
{ "_id" : ..., "StudentName" : "John", "StudentLastName" : "Doe" }
{ "_id" : ..., "StudentName" : "Carol", "StudentLastName" : "Taylor" }
{ "_id" : ..., "StudentName" : "David", "StudentLastName" : "Miller" }
Cập nhật: Đổi tên field "StudentName" -> "StudentFirstName"
> db.updateManyDocumentsDemo.updateMany({}, { $rename: { 'StudentName': "StudentFirstName" } });
Kết quả:
{ "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }
Kiểm tra:
> db.updateManyDocumentsDemo.find().pretty();
Kết quả:
{ "_id" : ..., "StudentLastName" : "Smith", "StudentFirstName" : "John" }
{ "_id" : ..., "StudentLastName" : "Doe", "StudentFirstName" : "John" }
{ "_id" : ..., "StudentLastName" : "Taylor", "StudentFirstName" : "Carol" }
{ "_id" : ..., "StudentLastName" : "Miller", "StudentFirstName" : "David" }
Các update operator phổ biến cho updateMany
| Operator | Mục đích | Ví dụ |
|---|---|---|
$set | Gán giá trị mới / thêm field | { $set: { status: "active", updatedAt: new Date() } } |
$unset | Xóa field | { $unset: { tempField: "" } } |
$inc | Tăng/giảm số | { $inc: { viewCount: 1 } } |
$mul | Nhân số | { $mul: { price: 1.1 } } |
$rename | Đổi tên field | { $rename: { oldName: "newName" } } |
$currentDate | Set timestamp hiện tại | { $currentDate: { lastModified: true } } |
Lưu ý quan trọng
- Atomic per document: Mỗi document cập nhật riêng biệt, không phải transaction toàn collection (trừ khi dùng multi-document transaction).
- Write Concern: Mặc định
w: 1. Với dữ liệu quan trọng, dùng{ writeConcern: { w: "majority" } }. - Upsert:
upsert: truesẽ insert mới nếu không khớp document nào (với filter {} thì luôn khớp -> không bao giờ upsert). - Rollback: Không thể rollback updateMany. Hãy backup hoặc test trên staging trước.