So sánh deleteOne() vs findOneAndDelete()
Cả hai đều xóa một tài liệu duy nhất, nhưng khác biệt quan trọng về giá trị trả về.
Bảng so sánh nhanh
| Đặc điểm | deleteOne() | findOneAndDelete() |
|---|---|---|
| Trả về tài liệu đã xóa | ❌ Không (chỉ kết quả xác nhận) | ✅ Có |
| Hỗ trợ sort | ❌ Không | ✅ Có |
| Atomic (nguyên tử) | ✅ Có | ✅ Có |
| Trường hợp dùng | Chỉ cần xóa | Cần xử lý tài liệu vừa xóa |
Ví dụ minh họa
Dữ liệu ban đầu
> db.demo448.insertOne({ "Name": "Chris", "Age": 21 });
> db.demo448.insertOne({ "Name": "David", "Age": 23 });
> db.demo448.insertOne({ "Name": "Bob", "Age": 22 });
Sử dụng deleteOne()
> db.demo448.deleteOne({ _id: ObjectId("5e7a2926bbc41e36cc3caecb") });
{ "acknowledged": true, "deletedCount": 1 }
→ Chỉ trả về xác nhận, không thấy nội dung tài liệu đã xóa.
Sử dụng findOneAndDelete()
> db.demo448.findOneAndDelete({ _id: ObjectId("5e7a2930bbc41e36cc3caecc") });
{ "_id": ObjectId("5e7a2930bbc41e36cc3caecc"), "Name": "Bob", "Age": 22 }
→ Trả về toàn bộ tài liệu vừa bị xóa.
Khi nào dùng findOneAndDelete()?
- Cần log/ghi nhận thông tin tài liệu đã xóa
- Xử lý logic nghiệp vụ dựa trên dữ liệu vừa xóa (ví dụ: hoàn trả kho, gửi email...)
- Cần xóa tài liệu theo thứ tự ưu tiên (kết hợp
sort)
// Ví dụ xóa tài liệu cũ nhất (theo _id) và lấy thông tin
db.collection.findOneAndDelete(
{ status: "expired" },
{ sort: { _id: 1 } } // xóa tài liệu cũ nhất
);