删除文档与删集合
本教程共 50 篇 · 第 26 篇 · 更新于 2026-07-30 · 约 6 分钟阅读
26. 删除文档与删集合
本节目标:掌握 deleteOne、deleteMany 删除文档的差别,了解空条件删全部的风险,并弄清楚 drop() 删集合与删库时索引和数据会怎样。
删除比更新更「狠」——删了就找不回来了。所以 MongoDB 的删除方法设计得清晰分明:删文档用 deleteOne/deleteMany,删整张集合用 drop()。
db.orders.insertMany([
{ _id: 1001, user_id: 1, status: "completed", total: 657 },
{ _id: 1002, user_id: 2, status: "cancelled", total: 398 },
{ _id: 1003, user_id: 1, status: "cancelled", total: 597 }
])
deleteOne:只删第一条匹配
和 updateOne 一个脾气,只删第一个命中的文档:
// 删掉第一个 status 为 cancelled 的订单
db.orders.deleteOne({ status: "cancelled" })
返回里 deletedCount 是 1。即使有两个 cancelled,也只删一个。
deleteMany:删掉所有匹配
想清空一类数据,用 deleteMany:
// 删掉用户 1 的全部订单
db.orders.deleteMany({ user_id: 1 })
返回 deletedCount 会是 2(_id 1001 和 1003)。
Warning
deleteMany({})带空条件会删除集合里所有文档,但集合本身还在。这和drop()不同,后者连集合结构都删。删全表前务必三思。
删文档不会动索引
不管是删一条还是删全部,集合上的索引都原封不动保留。MongoDB 官方明确这一点:删除文档不丢索引。所以你删光数据后重新插入,索引直接生效,不用重建。
drop():删掉整张集合
drop() 连集合带它的数据、索引一起删掉:
// 删除整个 orders 集合(含索引)
db.orders.drop()
返回 true 表示删除成功。集合一旦 drop,里面的索引也没了,再建集合要重新建索引。
Tip只想清空数据、保留索引和 collection 结构,用
deleteMany({});想连集合结构带索引全清掉,才用drop()。
删库:dropDatabase()
在数据库层面用 db.dropDatabase() 删掉当前库的所有集合:
// 删除当前所在的整个数据库
db.dropDatabase()
Warning删库是最高危操作,生产环境一定要有备份且反复确认。MongoDB 默认不回收站,删了就是真没了。
方法选择一览
| 操作 | 方法 | 是否保留集合 | 是否保留索引 |
|---|---|---|---|
| 删一条 | deleteOne | 是 | 是 |
| 删一类 | deleteMany | 是 | 是 |
| 清空数据 | deleteMany({}) | 是 | 是 |
| 删集合 | drop() | 否 | 否 |
| 删数据库 | dropDatabase() | 否 | 否 |
Note写操作在单文档层面是原子性的:一条记录要么删掉、要么没删。但
deleteMany一次删多条时,整批并非「全有或全无」——若执行中途被中断(如断网、主节点切换),可能只删了一部分。需要强一致请上事务。
删除讲完了。下章我们换个角度:查询返回的不是最终列表,而是一个「游标」,该怎么遍历它。