Để cập nhật một trường số bằng cách **nhân với một hệ số** (ví dụ: tăng lương 10% = nhân 1.1), MongoDB cung cấp toán tử $mul (multiply). Toán tử này thay đổi giá trị tại chỗ (in-place), atomic, và hiệu quả hơn nhiều so với đọc -> tính -> ghi.
1. Tạo bộ sưu tập nhân viên
> db.demo417.insertOne({ "EmployeeName": "Chris", "EmployeeSalary": 500 });
> db.demo417.insertOne({ "EmployeeName": "Mike", "EmployeeSalary": 1000 });
2. Xem dữ liệu ban đầu
> db.demo417.find();
Kết quả: Chris 500, Mike 1000.
3. Tăng lương 10% cho Chris và Mike (dùng $mul + $in + multi:true)
> db.demo417.update(
{ "EmployeeName": { $in: ["Chris", "Mike"] } },
{ $mul: { EmployeeSalary: 1.1 } },
{ multi: true }
);
WriteResult({ "nMatched": 2, "nUpserted": 0, "nModified": 2 })
Giải thích:
- Filter:
$inchọn 2 nhân viên. $mul: { EmployeeSalary: 1.1 }: Nhân trường EmployeeSalary với 1.1.multi: true: Áp dụng cho tất cả tài liệu khớp (cũ, dùng updateMany hiện nay).
4. Kết quả
> db.demo417.find();
Kết quả:
{ "_id": ObjectId("..."), "EmployeeName": "Chris", "EmployeeSalary": 550 }
{ "_id": ObjectId("..."), "EmployeeName": "Mike", "EmployeeSalary": 1100 }
Cách hiện đại (MongoDB 3.2+):
db.demo417.updateMany(
{ "EmployeeName": { $in: ["Chris", "Mike"] } },
{ $mul: { EmployeeSalary: 1.1 } }
);
Các toán tử cập nhật số học khác: $inc (cộng/trừ), $min, $max (giới hạn min/max).