การลบเอกสารหลายรายการด้วย Array ของ _id ใน MongoDB
ใช้ ออเปอเรเตอร์ $in ร่วมกับ remove() หรือ deleteMany() เพื่อลบเอกสารหลายรายการพร้อมกันโดยระบุ Array ของ _id
ไวยากรณ์
db.yourCollectionName.remove( { _id: { $in: [yourObjectId1, yourObjectId2, yourObjectId3] } } );
แนะนำ (MongoDB 3.2+): ใช้ deleteMany() แทน remove()
db.yourCollectionName.deleteMany( { _id: { $in: [yourObjectId1, yourObjectId2, ...] } } );
ตัวอย่างการสร้างคอลเลกชันและเพิ่มข้อมูล
> db.deleteMultipleIdsDemo.insertOne({"ClientName":"Chris","ClientAge":26});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cd7d6a629b87623db1b19") }
> db.deleteMultipleIdsDemo.insertOne({"ClientName":"Robert","ClientAge":28});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cd7dea629b87623db1b1a") }
> db.deleteMultipleIdsDemo.insertOne({"ClientName":"Sam","ClientAge":25});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cd7e9a629b87623db1b1b") }
> db.deleteMultipleIdsDemo.insertOne({"ClientName":"John","ClientAge":34});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cd7f7a629b87623db1b1c") }
> db.deleteMultipleIdsDemo.insertOne({"ClientName":"Carol","ClientAge":36});
{ "acknowledged" : true, "insertedId" : ObjectId("5c9cd803a629b87623db1b1d") }
แสดงข้อมูลก่อนลบ
> db.deleteMultipleIdsDemo.find().pretty();
ผลลัพธ์ (5 เอกสาร):
{ "_id" : ObjectId("5c9cd7d6a629b87623db1b19"), "ClientName" : "Chris", "ClientAge" : 26 }
{ "_id" : ObjectId("5c9cd7dea629b87623db1b1a"), "ClientName" : "Robert", "ClientAge" : 28 }
{ "_id" : ObjectId("5c9cd7e9a629b87623db1b1b"), "ClientName" : "Sam", "ClientAge" : 25 }
{ "_id" : ObjectId("5c9cd7f7a629b87623db1b1c"), "ClientName" : "John", "ClientAge" : 34 }
{ "_id" : ObjectId("5c9cd803a629b87623db1b1d"), "ClientName" : "Carol", "ClientAge" : 36 }
ลบเอกสาร 3 รายการ (_id ที่ 2, 4, 1)
> db.deleteMultipleIdsDemo.remove( {
_id: {
$in: [
ObjectId("5c9cd7dea629b87623db1b1a"),
ObjectId("5c9cd803a629b87623db1b1d"),
ObjectId("5c9cd7d6a629b87623db1b19")
]
}
} );
WriteResult({ "nRemoved" : 3 })
ตรวจสอบข้อมูลหลังลบ
> db.deleteMultipleIdsDemo.find().pretty();
ผลลัพธ์ (เหลือ 2 เอกสาร: Sam และ John):
{ "_id" : ObjectId("5c9cd7e9a629b87623db1b1b"), "ClientName" : "Sam", "ClientAge" : 25 }
{ "_id" : ObjectId("5c9cd7f7a629b87623db1b1c"), "ClientName" : "John", "ClientAge" : 34 }
คำอธิบาย
- $in : Match เอกสารที่ _id อยู่ใน Array ที่ระบุ
- nRemoved: 3 : แสดงจำนวนเอกสารที่ถูกลบจริง
- Atomic: การลบหลายรายการในคำสั่งเดียวเป็น Atomic operation
การใช้ deleteMany() (แนะนำสำหรับ MongoDB 3.2+)
> db.deleteMultipleIdsDemo.deleteMany( {
_id: {
$in: [
ObjectId("5c9cd7dea629b87623db1b1a"),
ObjectId("5c9cd803a629b87623db1b1d"),
ObjectId("5c9cd7d6a629b87623db1b19")
]
}
} );
{ "acknowledged" : true, "deletedCount" : 3 }
ข้อแตกต่าง remove() vs deleteMany()
| คุณสมบัติ | remove() | deleteMany() |
|---|---|---|
| Return Value | WriteResult | DeleteResult (มี deletedCount) |
| JustOne Option | รองรับ (justOne: true) | ไม่รองรับ (ใช้ deleteOne) |
| Deprecated | ใช่ (ใน MongoDB 5.0+) | ไม่ |
| Index Usage | รองรับ | รองรับ |
ตัวอย่างการลบด้วย _id แบบ String/Custom
// ถ้า _id เป็น String หรือ Number
db.collection.deleteMany({ _id: { $in: ["id1", "id2", 100, 200] } });
Best Practices
- ใช้ deleteMany() สำหรับ MongoDB ใหม่
- Backup ข้อมูลก่อนลบจำนวนมาก
- ทดสอบ Query ด้วย find() ก่อน เพื่อยืนยันเอกสารที่จะถูกลบ
- พิจารณาใช้ Transaction (MongoDB 4.0+) สำหรับการลบที่สำคัญ