Deleting Documents

1. Deleting Single Document

MethodReturns
deleteOne(filter){ acknowledged, deletedCount }
deleteOne(filter, {hint})Force index
RetryableYes

2. Deleting Multiple Documents

MethodDescription
deleteMany(filter)Delete all matches
deleteMany({})Delete all (keep indexes)
RetryableNo (multi op)

3. Using findOneAndDelete()

OptionPurpose
sortChoose which doc to delete
projectionReturned fields
collationString comparison rules
const oldest = await db.queue.findOneAndDelete({}, { sort: { createdAt: 1 } });

4. Deleting with Filter Criteria

FilterUse
{status: "expired"}Status-based cleanup
{createdAt: {$lt: cutoff}}Age-based
{_id: {$in: ids}}Batch by id

5. Handling Delete Results

FieldMeaning
acknowledgedFalse if w:0
deletedCountNumber actually removed
deletedCount === 0Filter matched nothing

6. Setting Write Concern for Deletes

SettingEffect
w: "majority"Wait for majority ack
j: trueWait for journal commit
wtimeoutms before failing

7. Using Bulk Delete Operations

OpEffect
deleteOneSingle-match delete in bulk
deleteManyMulti-match delete in bulk
await db.events.bulkWrite([
  { deleteMany: { filter: { type: "debug" } } },
  { deleteOne:  { filter: { _id: id } } },
], { ordered: false });

8. Deleting All Documents

ApproachTrade-off
deleteMany({})Keeps indexes; slow on large collections
drop() + recreateO(1) clear; must recreate indexes/validators
remove({}) DEPRECATEDRemoved in 7.0+

9. Using TTL Indexes for Automatic Deletion

AspectDetail
Createdb.sessions.createIndex({expireAt:1}, {expireAfterSeconds:0})
SweepBackground thread every 60s
Field typeBSON Date (or array of Dates)
CappedNot supported on capped collections

10. Implementing Soft Deletes

PatternDetail
Flag field{deletedAt: Date} + partial index excluding deleted
ViewCreate view filtering deletedAt: null
TTL purgeTTL index on deletedAt for eventual hard delete
db.posts.createIndex({deletedAt: 1}, {partialFilterExpression: {deletedAt: {$exists: true}}, expireAfterSeconds: 86400 * 30});
await db.posts.updateOne({_id: id}, {$set: {deletedAt: new Date()}});