Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Khác biệt giữa deleteOne() và findOneAndDelete() trong MongoDB

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ểmdeleteOne()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ùngChỉ cần xóaCầ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
);