【问题标题】:Why did this line delete everything in my MongoDB database?为什么这一行删除了我的 MongoDB 数据库中的所有内容?
【发布时间】:2011-04-20 04:25:55
【问题描述】:

好的,所以我正在尝试向我的网站推出一个小更新。一项更新包括查询可能存在或不存在的字段。这不像我想要的那样工作,所以我决定让它始终存在于我的数据库中。我在 MongoDB shell 中使用了这一行:

> db.entries.update({Published: null},{$set: {Published: true}},false,true);

现在,我不完全理解这如何导致 Published 为 null 的每个条目对象被删除。我的意思是,它确实被删除了。我尝试查找一些 ID,.findOne 将为它们返回 null。

那条线是如何工作的?我认为它将获取 Published 为空(不存在)的每个条目,并将 Published 设置为 true。

【问题讨论】:

    标签: mongodb database


    【解决方案1】:

    阅读操作员的行为比猜测操作员的行为要好。搜索 null 不同于检查是否存在。

    MongoDB 有一个专用的 $exists 运算符:

    http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24exists

    【讨论】:

    • 这说明了在生产环境中运行之前在暂存数据库上测试更新的必要性。
    • LOL - 当然....如果您在运行此类更新时不知道对生产的影响而没有在测试环境中对其进行正确测试,那么这只应该被贴上“不专业”的标签。跨度>
    • @Bryan @Rest 好吧,这只是我的小博客,我有备份。下一次肯定会在临时数据库中运行它。但即便如此。我不明白检查 ==nullexists 将如何改变删除所有内容的行为
    【解决方案2】:

    老实说,我不确定为什么它现在可以处理更改,或者至少,为什么它使用该命令删除了所有内容。

    我的结束命令如下所示:

    db.entries.update({Published: {$exists: false},$atomic: true},{$set:{"Published":true}},false,true);
    

    【讨论】:

      【解决方案3】:

      我认为它将获取 Published 为空(不存在)的每个条目,并将 Published 设置为 true。

      好的,所以这是两个不同的东西。

      已发布为空:

      { Published : null, post : 'blah' }
      

      已发布不存在:

      { post : 'blahblah' }
      

      【讨论】:

      • 这并不能解释为什么它删除了所有未设置已发布的对象
      【解决方案4】:

      您可能希望在 MongoDB 用户组(开发人员经常查看)http://groups.google.com/group/mongodb-user 上发布此问题

      【讨论】:

        【解决方案5】:

        更新不会删除文档。事实上,您运行的更新符合您的预期,例如,如果您希望 y 始终具有值:

        > db.foo.insert({x:1})
        > db.foo.insert({x:2})
        > db.foo.insert({y:null})
        > db.foo.insert({y:1})
        > db.foo.update({y:null},{$set : {y:true}}, false, true)
        > db.foo.find()
        { "_id" : ObjectId("4db02aabbe5a5418fb65d24c"), "y" : true }
        { "_id" : ObjectId("4db02aafbe5a5418fb65d24d"), "y" : 1 }
        { "_id" : ObjectId("4db02aa1be5a5418fb65d24a"), "x" : 1, "y" : true }
        { "_id" : ObjectId("4db02aa4be5a5418fb65d24b"), "x" : 2, "y" : true }
        

        一定有另一个操作进行了删除。日志中可能有它的记录(或者可能没有......这取决于它花了多长时间)。从这里的信息中无法判断是什么导致了删除,但更新不是这里的罪魁祸首。

        【讨论】:

        • 啊,所以删除实际上应该没有发生?这很奇怪,因为我的 MongoDB 实例上运行的东西并不多,所以我不太关心并行操作。
        猜你喜欢
        • 2011-03-22
        • 2018-08-30
        • 1970-01-01
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 2019-12-15
        • 2022-01-24
        相关资源
        最近更新 更多