删除数据
我将为您构建完整的MongoDB删除方法教程框架,以下是建议的Markdown内容结构(您可自由调整顺序或增减内容):
1 +++
2 title = "删除数据"
3 weight = 6
4 +++
5
6 ## 1. 基础删除操作
7 ### 1.1 deleteOne()
8 ```javascript
9 db.collection.deleteOne(
10 { <filter> }, // 条件匹配
11 {
12 writeConcern: <document>, // 可选写入策略
13 collation: <document> // 可选排序规则
14 }
15 )
1.2 deleteMany()
1 db . collection . deleteMany (
2 { < filter > }, // 可批量匹配的条件
3 {
4 writeConcern : < document >
5 }
6 )
2. 条件构建技巧
2.1 精确匹配
1 // 删除所有age=25的文档
2 db . users . deleteMany ({ age : 25 })
2.2 操作符组合
1 // 删除age>30且name以A开头的文档
2 db . users . deleteMany ({
3 age : { $gt : 30 },
4 name : { $regex : /^A/ }
5 })
6
7 // 返回值说明:
8
9 {
10 acknowledged : true , // 操作是否被确认
11 deletedCount : 1 , // 实际删除的文档数
12 // 当启用writeConcern时额外返回:
13 writeConcernError : { // 写入错误信息
14 code : 64 ,
15 errmsg : "waiting for replication timed out"
16 }
17 }
3. 生产环境实践
3.1 安全建议
先使用find()确认匹配结果
考虑添加writeConcern确保写入完成
重要数据建议先备份
3.2 性能优化
1 // 为常用删除条件创建索引
2 db . users . createIndex ({ status : 1 , lastActive : - 1 })
3.3 返回值处理示例
1 const result = db . orders . deleteOne ({ status : "cancelled" });
2 if ( result . deletedCount === 0 ) {
3 console . log ( "No documents were deleted" );
4 } else if ( result . writeConcernError ) {
5 console . error ( "Replication error:" , result . writeConcernError . errmsg );
6 }
4. 高级模式
4.1 事务处理
1 session . startTransaction ()
2 try {
3 db . orders . deleteOne ({ _id : orderId }, { session })
4 db . inventory . updateOne (
5 { item : "product" },
6 { $inc : { qty : 1 } },
7 { session }
8 )
9 session . commitTransaction ()
10 } catch ( e ) {
11 session . abortTransaction ()
12 }
4.2 软删除模式
1 // 更新替代删除
2 db . users . updateOne (
3 { _id : userId },
4 { $set : { isDeleted : true , deletedAt : new Date () } }
5 )
5. 常见问题
删除不存在的文档不会报错
删除操作不释放磁盘空间(需 compact )
分片集群删除注意事项