Để xóa một phần tài liệu (ví dụ: xóa các bản ghi sau vị trí thứ N), MongoDB có thể kết hợp find(), skip(), toArray(), map() để lấy danh sách _id cần xóa, sau đó dùng $in với remove() hoặc deleteMany().
Tạo dữ liệu mẫu (10 tài liệu)
> db.deleteDemo.insertOne({"Name":"John"}); // _id1
> db.deleteDemo.insertOne({"Name":"Carol"}); // _id2
> db.deleteDemo.insertOne({"Name":"Sam"}); // _id3
> db.deleteDemo.insertOne({"Name":"David"}); // _id4
> db.deleteDemo.insertOne({"Name":"Robert"});// _id5
> db.deleteDemo.insertOne({"Name":"Chris"}); // _id6
> db.deleteDemo.insertOne({"Name":"Mike"}); // _id7
> db.deleteDemo.insertOne({"Name":"Bob"}); // _id8
> db.deleteDemo.insertOne({"Name":"James"}); // _id9
> db.deleteDemo.insertOne({"Name":"Jace"}); // _id10
Xem tất cả tài liệu
> db.deleteDemo.find();
Xóa tài liệu từ thứ 6 trở đi (giữ 5 bản ghi đầu)
> var value = db.deleteDemo.find({}, {_id : 1}).skip(5).toArray().map(function(documentValue) { return documentValue._id; }); > db.deleteDemo.remove({_id: {$in: value}}); WriteResult({ "nRemoved" : 5 })Kết quả - chỉ còn 5 bản ghi đầu
> db.deleteDemo.find();Giải thích từng bước
find({}, {_id: 1}): Lấy tất cả tài liệu, chỉ chọn _idskip(5): Bỏ qua 5 bản ghi đầutoArray(): Chuyển cursor thành mảng JavaScriptmap(...): Trích xuất _id từ mỗi tài liệu → mảng các ObjectIdremove({_id: {$in: value}}): Xóa tất cả tài liệu có _id trong mảngCách hiện đại (MongoDB 3.2+)
// Lấy _id cần xóa const idsToDelete = db.deleteDemo.find({}, {_id: 1, _id: 1}).skip(5).toArray().map(d => d._id); // Xóa với deleteMany db.deleteDemo.deleteMany({_id: {$in: idsToDelete}});Cách hiệu quả hơn cho collection lớn
Sử dụng sort + limit để xác định ngưỡng, sau đó xóa theo điều kiện:
// Giả sử có trường createdAt hoặc _id tăng dần var cutoffDoc = db.deleteDemo.find().sort({_id: 1}).skip(5).limit(1).next(); if (cutoffDoc) { db.deleteDemo.deleteMany({_id: {$gt: cutoffDoc._id}}); }⚠️ Cảnh báo
remove()đã deprecated, dùngdeleteMany()- Cách dùng
forEach/maptrên shell chỉ phù hợp dữ liệu nhỏ - Với dữ liệu lớn, hãy dùng Aggregation + $merge hoặc script côté application
- Luôn backup trước khi xóa hàng loạt