Cập nhật toàn bộ tài liệu với replaceOne()
Cách nhanh nhất để thay thế toàn bộ tài liệu (giữ nguyên _id) là sử dụng replaceOne() thay vì updateOne() với nhiều $set.
1. Dữ liệu mẫu
> db.demo431.insertOne({ "Name": "Chris", "Age": 32 });
{ "acknowledged": true, "insertedId": ObjectId("5e770ba6bbc41e36cc3cae89") }
> db.demo431.insertOne({ "Name": "David", "Age": 31 });
{ "acknowledged": true, "insertedId": ObjectId("5e770bacbbc41e36cc3cae8a") }
> db.demo431.insertOne({ "Name": "John", "Age": 24 });
{ "acknowledged": true, "insertedId": ObjectId("5e770bb3bbc41e36cc3cae8b") }
> db.demo431.insertOne({ "Name": "Bob", "Age": 22 });
{ "acknowledged": true, "insertedId": ObjectId("5e770bb8bbc41e36cc3cae8c") }
2. Thay thế tài liệu có Name = "John"
> db.demo431.replaceOne(
{ "Name": "John" },
{ "Name": "Robert", "Age": 45 }
);
{ "acknowledged": true, "matchedCount": 1, "modifiedCount": 1 }
3. Kết quả sau cập nhật
> db.demo431.find();
{ "_id": ObjectId("5e770ba6bbc41e36cc3cae89"), "Name": "Chris", "Age": 32 }
{ "_id": ObjectId("5e770bacbbc41e36cc3cae8a"), "Name": "David", "Age": 31 }
{ "_id": ObjectId("5e770bb3bbc41e36cc3cae8b"), "Name": "Robert", "Age": 45 }
{ "_id": ObjectId("5e770bb8bbc41e36cc3cae8c"), "Name": "Bob", "Age": 22 }
So sánh replaceOne vs updateOne
| Đặc điểm | replaceOne() | updateOne() + $set |
|---|---|---|
| Thay thế toàn bộ doc | ✅ Có | ❌ Chỉ cập nhật trường chỉ định |
| Giữ _id | ✅ Có | ✅ Có |
| Xóa trường không có trong doc mới | ✅ Có | ❌ Giữ nguyên |
| Hiệu suất | Nhanh hơn cho doc lớn | Chậm hơn nếu nhiều trường |
Lưu ý: replaceOne sẽ xóa hoàn toàn các trường không có trong tài liệu mới. Hãy chắc chắn bạn muốn thay thế hoàn toàn.