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

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

Để 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

  1. find({}, {_id: 1}): Lấy tất cả tài liệu, chỉ chọn _id
  2. skip(5): Bỏ qua 5 bản ghi đầu
  3. toArray(): Chuyển cursor thành mảng JavaScript
  4. map(...): Trích xuất _id từ mỗi tài liệu → mảng các ObjectId
  5. remove({_id: {$in: value}}): Xóa tất cả tài liệu có _id trong mảng

Cá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ùng deleteMany()
  • Cách dùng forEach/map trê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