deleteOne() - 删除单个文档
deleteOne() 方法删除集合中第一个匹配筛选条件的文档。
语法
参数
filter(必需)
类型: Object
用于匹配要删除的文档的筛选条件。使用 MongoDB 查询操作符。
options(可选)
类型: Object
返回值
类型: Promise<Object>
返回一个包含删除结果的对象:
面向已声明关系的受保护 Model 删除
collection.deleteOne() 保持原有行为。如果删除时必须阻止仍被已声明 Model relation 引用的目标,请显式使用 Model API:
checkRelationUsage() 是零写入检查,返回 used、每条关系的数量/有限 sample ID 以及 coverage。发现范围刻意限定为 registered-declared:只能发现当前 runtime 已注册、且明确声明为入站 relation 的 Model 关系。默认仍把软删除来源文档计作引用;只有诊断性查询才应显式设置 includeSoftDeletedReferences: false。
deleteOneWithRelations() 和 forceDeleteWithRelations() 要求传入非空对象 filter。它们先解析一个目标,扫描所有已声明入站关系,只有 coverage.complete 为 true 且不存在引用时,才调用既有的 Model 软删除或物理删除。为了不削弱安全性,受保护删除会拒绝 includeRelations 和 excludeRelations;使用它们缩小范围的只读检查会明确返回不完整 coverage。
RELATION_IN_USE:至少发现一条已声明引用;不会发出删除写入。RELATION_USAGE_UNAVAILABLE:目标/来源扫描失败、命中maxTargets或 coverage 不完整;不会发出删除写入。
这是 restrict 风格的保护,不是数据库外键:不会从任意数据或 $lookup 管道反推关系,不会 cascade/更新引用,也无法消除扫描后并发新建引用的竞态。部署和业务工作流能够协调时,请用同一个 session/transaction 包裹相关写入。
核心特性
✅ 只删除第一个匹配的文档
即使有多个文档匹配筛选条件,deleteOne() 也只删除第一个匹配的文档。
✅ 显式缓存失效
删除成功后,monSQLize 默认不清理查询缓存。需要清理时,使用 cache.invalidate 精准失效,或使用 autoInvalidate: true 做集合级 broad 失效。
✅ 慢查询监控
超过阈值(默认 1000ms)的删除操作会自动记录警告日志。
常见场景
场景 1: 删除单个用户
场景 2: 清理过期数据
场景 3: 删除特定状态的记录
场景 4: 使用索引提示优化性能
场景 5: 设置操作超时
与其他方法的区别
vs deleteMany
vs findOneAndDelete
错误处理
无效的筛选条件
操作超时
写关注错误
性能优化建议
1. 使用索引
确保筛选条件中的字段有索引:
2. 使用索引提示
对于复杂查询,明确指定使用哪个索引:
3. 设置合理的超时
4. 使用精确的筛选条件
注意事项
⚠️ 删除是不可逆的
⚠️ 删除顺序不确定
如果有多个文档匹配,删除哪个是不确定的(除非使用排序):
⚠️ 删除不影响索引
删除文档不会删除索引,索引会自动更新。
⚠️ 缓存失效的范围
autoInvalidate: true 会清理整个集合的相关缓存,不仅仅是被删除的文档:
相关方法
- deleteMany() - 删除所有匹配的文档
- findOneAndDelete() - 原子地查找并删除文档,返回被删除的文档
- updateOne() - 更新单个文档(软删除的替代方案)
示例代码
完整的示例代码请参考 delete 可运行示例。