mongodb 里 remove(None) 竟然是删库(#°Д°)

2018-08-13 02:39:30 +08:00
 JCZ2MkKb5S8ZX9pq

pymongo
手贱先取了个

old = db.find_one({conditions})

然后想更新 _id,就想删旧的再 insert,感觉旧的应该含 _id ,于是:

db.remove(old)
db.insert(new)

大意了 old 会取到 None,然后再 remove,竟然是删库……
还好损失不算太大,但第一次碰到,吐槽下。

7738 次点击
所在节点    MongoDB
31 条回复
Perry
2018-08-13 02:58:59 +08:00
官方文档写的很清楚:

To delete all documents in a collection, pass an empty document ({}).
Trim21
2018-08-13 05:55:28 +08:00
一直在用 delete_one, 而且这种情况一直写成{_id:old['_id']}, 从来不把变量直接传进去…
mooncakejs
2018-08-13 06:17:28 +08:00
sql 不加 where?
boywang004
2018-08-13 08:09:22 +08:00
又一次触发了吃瓜系人民群众喜闻乐见的事件…… 2333
yulitian888
2018-08-13 08:11:01 +08:00
做这种操作难道不是应该用 upsert:true 参数的??
reus
2018-08-13 08:33:31 +08:00
虽然说楼主不看文档算有错
但当初设计这种接口的人就是蠢到爆炸
g079708
2018-08-13 08:40:12 +08:00
感谢入坑提醒
tulongtou
2018-08-13 08:46:53 +08:00
@reus #6 remove 就是删除,参数是条件,你删除不加条件跟 SQL 删除不加 where 有什么区别
lrh3321
2018-08-13 08:47:47 +08:00
好蠢,还好我只在测试环境下删记录
reus
2018-08-13 09:01:11 +08:00
@tulongtou 没区别啊,SQL 也一样蠢啊。
zhicheng
2018-08-13 09:42:21 +08:00
SQL 的 WHERE 参数里传 null 并不会删除全部数据,至少大多数情况不会。

你们觉得是数据库 Model 里生成不带 WHERE 的 DELETE 容易出现,还是程序里有个变量变成 null 容易出现?
reus
2018-08-13 09:53:54 +08:00
@tulongtou 我错了,SQL 的 DELETE 传了 id = null,一条数据都不会删除,SQL 没有 mongodb 这么蠢。这里根本不是不加条件,而是 id = old,而 old 为 null,也就是 id = null。
shintendo
2018-08-13 11:07:32 +08:00
@reus 你又错了,这里不是 id = null, 而是楼主自信认为 old 里面包含 id = XXX
glues
2018-08-13 11:44:53 +08:00
mongodb 你也敢用?
reus
2018-08-13 11:49:47 +08:00
@shintendo 这样…
ilaipi
2018-08-13 12:56:53 +08:00
奇怪了,都没有人觉得 删集合和删库不一个概念?
noNOno
2018-08-13 14:19:58 +08:00
太危险了.
感觉这接口开发者对 null 的理解有点弱.
BOYPT
2018-08-13 14:26:33 +08:00
尽然.find()返回全库,.remove()删除全库挺合理的。
batter
2018-08-13 15:27:52 +08:00
只 insert,update,不 delete,remove
JCZ2MkKb5S8ZX9pq
2018-08-13 16:32:02 +08:00
@ilaipi 对的 我说笼统了 是删了个 collection

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/479169

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX