Mongodb的危险操作delete

前言

经常听到各种有趣的新闻,程序员对老板不满,一怒之下删库跑路。或某大厂误操作,把关键数据表删除导致业务停滞几个小时。删库和删表,都是很危险的操作,执行前需要谨慎。否则,轻则需要数据恢复,重则需要引咎辞职甚至锒铛入狱。演绎真实版的从入门到入狱。

数据宝贵,千万不要因为错误的操作,导致致命损失。执行删除操作前,也请反复确认删除的数据是否符合目标。

本文介绍delete操作前,先介绍一些删除操作的经验。

  • 执行delete前,使用find确认删除的数据范围。mongodb删除命令与查找命令find中的过滤器相同。执行删除时,将find替换成remove或deleteMany命令,即可删除目标数据。
  • 删除重要数据前,可以对数据进行预先备份,这样即使错误的删除数据,也可以进行恢复。
  • 优先考虑使用update方法进行数据逻辑删除,需要时进行物理删除。

Mongodb的删除方法

mongodb提供了两种删除方法

复制代码
//删除多条数据
db.collection.deleteMany()
//删除一条数据
db.collection.deleteOne()

用户可以使用Mongo DB Atlas页面,用户自己的应用程序,Mongodb Compass等数据库客户端执行数据删除程序。

删除集合中所有文档

向deleteMany()方法中传递一个空的过滤器,即可删除所有文档

复制代码
//删除集合中所有文档
db.collection.deleteMany({},options)//其中options是可选项,用户可以按照需要添加

定义options

复制代码
{
  writeConcern:<document>,
  collation:<document>,
  hint:<document|string>
}

在下表中列出参数说明

|--------------|----------|-------------------|
| 参数 | 类型 | 说明 |
| writeConcern | 文档类型 | 可选参数,定义复制集中数据提交类型 |
| collation | 文档类型 | 可选参数,指定字符序 |
| hint | 文档类型或字符串 | 指定删除文档时用到的索引 |

按指定条件删除文档

通过向过滤器中指定查询条件,删除查询过滤出来的数据。

复制代码
//删除符合查询条件的文档
db.collection.deleteMany({<field1>: <value>})

删除一条文档记录

使用deleteOne方法,删除一条记录

复制代码
//删除符合条件的一条记录
db.collection.deleteOne({<field1>:<value1>},options)

这里,相信很多用户又会有一些疑问,如果使用的过滤器能够查询出来多条记录,怎样确定删除的第一条记录?当没有指定排序时,mongodb默认的数据排序是按照数据插入时的顺序排序。使用不加排序的find名利查找出来的第一条记录,就是被删除的记录。删除之前,需要确定好第一条记录是哪一条。最好使用文档的_id字段等能够唯一确定文档的字段来删除一条数据,避免产生不必要的错误。

定义options

复制代码
{
  writeConcern:<document>,
  collation:<document>,
  hint:<document|string>
}

在下表中列出参数说明

|--------------|----------|-------------------|
| 参数 | 类型 | 说明 |
| writeConcern | 文档类型 | 可选参数,定义复制集中数据写入策略 |
| collation | 文档类型 | 可选参数,指定字符序 |
| hint | 文档类型或字符串 | 指定删除文档时用到的索引 |

写入策略writeConcern

复制集指定删除数据时的数据写入策略。如果从节点返回主节点的时间多于100毫秒,删除报错,

复制代码
//三节点的复制集合中,设置写入策略为majority从节点等待时间为100
db.orders.deleteMany({
  "client": "Crude Traders Inc."
}, {
  writeConcert: { w: "majority", wtimeout: 100}
})

WriteConcernError({
   "code" : 64,
   "errmsg" : "waiting for replication timed out",
   "errInfo" : {
     "wtimeout" : true,
     "writeConcern" : {    // Added in MongoDB 4.4
       "w" : "majority",
       "wtimeout" : 100,
       "provenance" : "getLastErrorDefaults"
     }
   }
})

索引

删除数据时,索引不会删除。当索引与集合中数据差异较大时,需要重建索引,减少索引所在空间,提高索引效率。

相关推荐
星星也在雾里8 小时前
PgBouncer 解决 PostgreSQL 连接数超限 + 可视化监控
数据库·postgresql
雨辰AI9 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城202410 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有10 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao10 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_7488394910 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录10 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
海市公约11 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理
颂love12 小时前
MySQL的执行流程
android·数据库·mysql
程序leo源12 小时前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#