删除数据

我将为您构建完整的MongoDB删除方法教程框架,以下是建议的Markdown内容结构(您可自由调整顺序或增减内容):

 1+++  
 2title = "删除数据"  
 3weight = 6
 4+++  
 5
 6## 1. 基础删除操作
 7### 1.1 deleteOne()
 8```javascript
 9db.collection.deleteOne(
10   { <filter> },  // 条件匹配
11   {
12     writeConcern: <document>, // 可选写入策略
13     collation: <document>     // 可选排序规则
14   }
15)

1.2 deleteMany()

1db.collection.deleteMany(
2   { <filter> },  // 可批量匹配的条件
3   {
4     writeConcern: <document>  
5   }
6)

2. 条件构建技巧

2.1 精确匹配

1// 删除所有age=25的文档
2db.users.deleteMany({ age: 25 })  

2.2 操作符组合

 1// 删除age>30且name以A开头的文档
 2db.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// 为常用删除条件创建索引
2db.users.createIndex({ status: 1, lastActive: -1 })

3.3 返回值处理示例

1const result = db.orders.deleteOne({ status: "cancelled" });
2if (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 事务处理

 1session.startTransaction()
 2try {
 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// 更新替代删除
2db.users.updateOne(
3  { _id: userId },
4  { $set: { isDeleted: true, deletedAt: new Date() } }
5)

5. 常见问题

  • 删除不存在的文档不会报错
  • 删除操作不释放磁盘空间(需 compact )
  • 分片集群删除注意事项