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"
     }
   }
})

索引

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

相关推荐
广州智造2 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥5 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸6 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1237 小时前
Redis解析
数据库·redis·缓存
数据库幼崽7 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd7 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou8 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh8 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵9 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多10 小时前
Linux——mysql主从复制与读写分离
数据库·mysql