Cập nhật tài liệu trong MongoDB dựa trên _id
Cách cơ bản và an toàn nhất: dùng updateOne() (hoặc update() cũ) với filter trên _id và toán tử $set.
1. Dữ liệu mẫu
> db.demo458.insertOne({ _id: 101, "Name": "David" });
> db.demo458.insertOne({ _id: 102, "Name": "Chris" });
> db.demo458.insertOne({ _id: 103, "Name": "Bob" });
2. Cập nhật Name của _id: 102
> db.demo458.update({ _id: 102 }, { $set: { "Name": "David Miller" } });
WriteResult({ "nMatched": 1, "nUpserted": 0, "nModified": 1 })
3. Kết quả
> db.demo458.find();
{ "_id": 101, "Name": "David" }
{ "_id": 102, "Name": "David Miller" }
{ "_id": 103, "Name": "Bob" }
Các phương thức cập nhật hiện đại (MongoDB 3.2+)
| Phương thức | Mô tả | Trả về |
|---|---|---|
| updateOne(filter, update) | Cập nhật 1 doc khớp filter | { acknowledged, matchedCount, modifiedCount } |
| updateMany(filter, update) | Cập nhật TẤT CẢ doc khớp | Giống updateOne |
| replaceOne(filter, replacement) | Thay thế toàn bộ doc (giữ _id) | Giống updateOne |
| findOneAndUpdate(filter, update) | Cập nhật VÀ trả về doc (trước/sau) | Tài liệu (document) |
Ví dụ updateOne() hiện đại
db.demo458.updateOne(
{ _id: 102 },
{ $set: { "Name": "David Miller", "UpdatedAt": new Date() } }
);
Toán tử cập nhật thường dùng
$set: Gán giá trị (tạo mới nếu chưa có)$unset: Xóa trường$inc: Tăng/giảm số$push/$pull: Thêm/xóa phần tử mảng$rename: Đổi tên trường$currentDate: Cập nhật timestamp
Best practice: Luôn filter bằng _id (hoặc unique index) để tránh cập nhật nhầm nhiều tài liệu.