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

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

  •  1
     
  •   JCZ2MkKb5S8ZX9pq · 2018-08-13 02:39:30 +08:00 · 7882 次点击
    这是一个创建于 2279 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    Perry
        1
    Perry  
       2018-08-13 02:58:59 +08:00 via iPhone
    官方文档写的很清楚:

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

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