Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ลบข้อมูลบางส่วน (Partial Delete) ใน MongoDB ด้วย skip() และ map()

บทความนี้สาธิตเทคนิคลบเอกสารบางส่วนในคอลเลกชัน โดยข้าม 5 เรคคอร์ดแรก แล้วลบที่เหลือทั้งหมด ใช้ skip(), toArray(), map() และ remove() ร่วมกับ $in

สร้างข้อมูลตัวอย่าง (10 เรคคอร์ด)

> db.deleteDemo.insertOne({"Name":"John"});   // _id ...9f06
> db.deleteDemo.insertOne({"Name":"Carol"});  // _id ...9f07
> db.deleteDemo.insertOne({"Name":"Sam"});    // _id ...9f08
> db.deleteDemo.insertOne({"Name":"David"});  // _id ...9f09
> db.deleteDemo.insertOne({"Name":"Robert"}); // _id ...9f0a
> db.deleteDemo.insertOne({"Name":"Chris"});  // _id ...9f0b
> db.deleteDemo.insertOne({"Name":"Mike"});   // _id ...9f0c
> db.deleteDemo.insertOne({"Name":"Bob"});    // _id ...9f0d
> db.deleteDemo.insertOne({"Name":"James"});  // _id ...9f0e
> db.deleteDemo.insertOne({"Name":"Jace"});   // _id ...9f0f

แสดงข้อมูลทั้ง 10 เรคคอร์ด

> db.deleteDemo.find();
{ "_id" : ObjectId("5cd550492cba06f46efe9f06"), "Name" : "John" }
{ "_id" : ObjectId("5cd5504d2cba06f46efe9f07"), "Name" : "Carol" }
{ "_id" : ObjectId("5cd550512cba06f46efe9f08"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd5505d2cba06f46efe9f09"), "Name" : "David" }
{ "_id" : ObjectId("5cd550682cba06f46efe9f0a"), "Name" : "Robert" }
{ "_id" : ObjectId("5cd5506f2cba06f46efe9f0b"), "Name" : "Chris" }
{ "_id" : ObjectId("5cd550752cba06f46efe9f0c"), "Name" : "Mike" }
{ "_id" : ObjectId("5cd5507a2cba06f46efe9f0d"), "Name" : "Bob" }
{ "_id" : ObjectId("5cd550822cba06f46efe9f0e"), "Name" : "James" }
{ "_id" : ObjectId("5cd550862cba06f46efe9f0f"), "Name" : "Jace" }

ลบข้อมูลหลังจาก 5 เรคคอร์ดแรก (Skip 5)

> 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 })

ตรวจสอบผลลัพธ์ (เหลือ 5 เรคคอร์ดแรก)

> db.deleteDemo.find();
{ "_id" : ObjectId("5cd550492cba06f46efe9f06"), "Name" : "John" }
{ "_id" : ObjectId("5cd5504d2cba06f46efe9f07"), "Name" : "Carol" }
{ "_id" : ObjectId("5cd550512cba06f46efe9f08"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd5505d2cba06f46efe9f09"), "Name" : "David" }
{ "_id" : ObjectId("5cd550682cba06f46efe9f0a"), "Name" : "Robert" }

คำอธิบายขั้นตอน

  1. find({}, {_id:1}) - ดึงเฉพาะ _id ทุก Document
  2. .skip(5) - ข้าม 5 ตัวแรก
  3. .toArray() - แปลง Cursor เป็น Array ของ Document
  4. .map(fn) - แปลง Array ของ Document ให้เป็น Array ของ _id เท่านั้น
  5. remove({_id: {$in: value}}) - ลบทุก Document ที่ _id อยู่ใน Array

วิธีทันสมัยกว่า (MongoDB 3.2+): ใช้ deleteMany()

var idsToDelete = db.deleteDemo.find({}, {_id:1}).skip(5).toArray().map(d => d._id);
db.deleteDemo.deleteMany({ _id: { $in: idsToDelete } });

ตัวอย่างเพิ่มเติม: ลบแบบสุ่ม (Random Sample)

// ลบ 30% ของข้อมูลแบบสุ่ม
db.collection.aggregate([ { $sample: { size: Math.floor(count * 0.3) } } ])
  .forEach(doc => db.collection.deleteOne({ _id: doc._id }));