首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
华为云
V2EX  ›  MongoDB

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

  •  1
     
  •   JCZ2MkKb5S8ZX9pq · 5 天前 · 3743 次点击

    pymongo
    手贱先取了个

    old = db.find_one({conditions})
    

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

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

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

    31 回复  |  直到 2018-08-14 11:00:07 +08:00
        1
    Perry   5 天前 via iPhone
    官方文档写的很清楚:

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

    你们觉得是数据库 Model 里生成不带 WHERE 的 DELETE 容易出现,还是程序里有个变量变成 null 容易出现?
        12
    reus   5 天前
    @tulongtou 我错了,SQL 的 DELETE 传了 id = null,一条数据都不会删除,SQL 没有 mongodb 这么蠢。这里根本不是不加条件,而是 id = old,而 old 为 null,也就是 id = null。
        13
    shintendo   5 天前
    @reus 你又错了,这里不是 id = null, 而是楼主自信认为 old 里面包含 id = XXX
        14
    glues   5 天前
    mongodb 你也敢用?
        15
    reus   5 天前
    @shintendo 这样…
        16
    ilaipi   5 天前
    奇怪了,都没有人觉得 删集合和删库不一个概念?
        17
    noNOno   5 天前
    太危险了.
    感觉这接口开发者对 null 的理解有点弱.
        18
    BOYPT   5 天前
    尽然.find()返回全库,.remove()删除全库挺合理的。
        19
    batter   5 天前
    只 insert,update,不 delete,remove
        20
    JCZ2MkKb5S8ZX9pq   5 天前
    @ilaipi 对的 我说笼统了 是删了个 collection
        21
    JCZ2MkKb5S8ZX9pq   5 天前
    @yulitian888
    @batter
    想更新 _id,这样省掉一个标记更新时间的字段。
        22
    JCZ2MkKb5S8ZX9pq   5 天前
    @Perry
    @BOYPT
    pymongo 在大部分情况下,类型稍有不对就会报错的。如果它能考虑,区分一下 {} 和 None。
    db.find() 返全部,db.find({}) 也可以理解(不设条件),但 db.find(None) 还是有点意外。
        23
    460881773   5 天前
    你如果你 没有条件,就是 删除全部。所以一定要加条件
        24
    Trumeet   5 天前 via Android
    然后再跑路?(雾
        25
    poorcai   5 天前 via iPhone
    同意六楼😂
        26
    wngwei   5 天前
    @glues mongodb 咋的了……
        27
    leafiy   5 天前
    还好不会 mongo,只用 mongoose
        28
    wdlth   5 天前 via Android
    论伪删除的重要性
        29
    glues   5 天前 via iPhone
    @wngwei 坑太多,很容易导致你跑路
        30
    wngwei   4 天前
    @glues 😂原来是这样
        31
    pabupa   4 天前
    🤣
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   实用小工具   ·   1859 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 18ms · UTC 13:53 · PVG 21:53 · LAX 06:53 · JFK 09:53
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1