首页/数据/NoSQL 速查/deleteOne / deleteMany 与清空集合
MongoDB99 条

deleteOne / deleteMany 与清空集合

按条件删除文档:deleteOne 删除首条匹配,deleteMany 删除全部匹配,drop() 直接删除整个集合(更快但索引一并消失)。

NoSQL 速查数据更新于 2026-10-13

删除文档与集合

deleteOne 删除第一条匹配文档,deleteMany 删除全部匹配文档,drop() 直接删除整个集合(索引一并消失)。删除文档只是标记,空间由存储引擎延迟回收;drop 会立即释放集合占用,速度远快于逐条删除。三者都不可恢复,执行前的核对步骤是流程的一部分而不是可选项。

基本信息

deleteOne删除第一条匹配文档
deleteMany删除全部匹配文档
drop删除集合与索引,不可恢复
返回值deletedCount 为实际删除条数
空间回收单条删除延迟回收,drop 立即释放
安全前置用相同条件先统计命中数量

典型使用场景

  • 清理过期会话与临时数据,配合过期时间字段批量删
  • 按时间归档后删除历史分区数据
  • 清理测试环境产生的脏数据,保留正式数据
  • 整体刷新:drop 后重建集合与索引,比逐条删更快
  • 定点回滚:按业务条件删除误写入的文档
  • 存储紧张时先 drop 最大的临时集合缓解压力

删除示例

删除示例
db.sessions.deleteMany({ expireAt: { $lt: new Date() } })     # 按时间清理过期数据
db.orders.deleteOne({ _id: 1001 })                            # 精确删除一条
db.tmp.drop()                                                 # 整集合删除,索引一并消失
db.audit.countDocuments({ ts: { $lt: ISODate("2026-01-01T00:00:00Z") } })   # 先数再删
db.audit.deleteMany({ ts: { $lt: ISODate("2026-01-01T00:00:00Z") } })       # 分批执行更稳

三种删除方式对照

方式影响范围适用场景
deleteOne最多 1 条按主键精确删除
deleteMany全部匹配按条件批量清理
drop整个集合重建式清理
renameCollection不改数据先改名归档再删除
deleteMany({}) 会清空集合但保留集合与索引,速度远慢于 drop;执行前务必确认当前库与集合名,Shell 里没有二次确认。
大批量删除会长时间持有锁并产生大量日志,按时间范围分批删除(每批几万条)比一次删几千万条更安全。
删除释放的空间不会立即归还操作系统,碎片多时评估 compact 或迁移重建,不要只盯着磁盘占用数字。

易错点

  • 先用相同条件 countDocuments 核对数量再删,误删只能靠备份恢复
  • 把待删条件写错(如 $lt 写成 $gt)会删掉要保留的数据,条件里的时间与方向要复查一遍
  • drop 会连索引一起删除,重建集合后必须重新建索引,否则查询性能会明显下降
  • 一次性删除超大范围数据会阻塞写入,应按时间分片多次执行
  • 删除后空间未归还,磁盘告警仍持续,需要 compact 或分片迁移才能真正释放

数据来源与参考

  • MongoDB Manual: Delete Documents
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌