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

Xóa dữ liệu một phần (partial data) trong MongoDB

Xóa một phần document: skip N đầu, xóa phần còn lại

Ví dụ minh họa xóa các document từ vị trí thứ 5 trở đi (giữ 4 document đầu) bằng cách lấy _id rồi remove().

1. Dữ liệu 7 document

> db.demo488.insertOne({ Name: "Chris" });
> db.demo488.insertOne({ Name: "David" });
> db.demo488.insertOne({ Name: "Bob" });
> db.demo488.insertOne({ Name: "Mike" });
> db.demo488.insertOne({ Name: "Sam" });
> db.demo488.insertOne({ Name: "John" });
> db.demo488.insertOne({ Name: "Robert" });

2. Script xóa từ document thứ 5 (skip 4)

> var deleteData = db.demo488.find({}, { _id: 1 }).skip(4).toArray().map(function(d) { return d._id; });
> db.demo488.remove({ _id: { $in: deleteData } });
WriteResult({ "nRemoved": 3 })

3. Kết quả: Giữ 4 document đầu

> db.demo488.find();
{ "_id": ObjectId("5e8351e0b0f3fa88e22790b2"), "Name": "Chris" }
{ "_id": ObjectId("5e8351e8b0f3fa88e22790b3"), "Name": "David" }
{ "_id": ObjectId("5e8351ebb0f3fa88e22790b4"), "Name": "Bob" }
{ "_id": ObjectId("5e8351eeb0f3fa88e22790b5"), "Name": "Mike" }

⚠️ Cảnh báo: Cách này KHÔNG khuyến khích cho production

Vấn đềMô tả
Không atomicGiữa find và remove có thể có write khác
Thứ tự không đảm bảofind() không sort → "đầu" không xác định
remove() deprecatedMongoDB 4.2+ dùng deleteMany()
Hiệu suất kém2 round-trip, load _id về client

Cách CHUẨN: Delete với sort + limit (MongoDB 4.4+)

// Xóa 3 document CŨ NHẤT (theo _id tăng dần)
db.demo488.deleteMany(
    { _id: { $in: db.demo488.find().sort({ _id: 1 }).limit(3).map(d => d._id) } }
);

// Hoặc dùng aggregation trong delete (MongoDB 5.0+)
db.demo488.deleteMany(
    { _id: { $in: db.demo488.aggregate([{ $sort: { _id: 1 } }, { $limit: 3 }, { $project: { _id: 1 } }]).map(d => d._id) } }
);

Cách tốt nhất: TTL Index (tự động xóa hết hạn)

// Tự động xóa document sau 30 ngày từ createdAt
db.demo488.createIndex({ createdAt: 1 }, { expireAfterSeconds: 30 * 24 * 60 * 60 });

Các loại xóa một phần khác

  • Xóa trường trong object: $unset
  • Xóa phần tử trong mảng: $pull, $pop (đầu/cuối), $pullAll
  • Xóa document theo điều kiện: deleteOne(), deleteMany()
  • Truncate collection: db.collection.drop() (xóa cả collection, nhanh hơn deleteMany)