删除文档与集合
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 或迁移重建,不要只盯着磁盘占用数字。