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 atomic | Giữa find và remove có thể có write khác |
| Thứ tự không đảm bảo | find() không sort → "đầu" không xác định |
| remove() deprecated | MongoDB 4.2+ dùng deleteMany() |
| Hiệu suất kém | 2 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)