删除数据
我将为您构建完整的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 )
- 分片集群删除注意事项