为什么这行会删除MongoDB数据库中的所有内容?

时间:2011-04-20 04:25:56

标签: mongodb database

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

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

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

这条线如何运作?我认为将发布的每个条目都为null(不存在),并将Published设置为true。

5 个答案:

答案 0 :(得分:3)

阅读操作员行为比猜测操作员行为更好。搜索null与执行存在检查不同。

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

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

答案 1 :(得分:0)

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

我的结束命令如下:

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

答案 2 :(得分:0)

  

我认为将发布的每个条目都为null(不存在),并将Published设置为true。

好的,所以这些是两件不同的事情。

已发布为null:

{ Published : null, post : 'blah' }

已发布不存在:

{ post : 'blahblah' }

答案 3 :(得分:0)

您可能希望在http://groups.google.com/group/mongodb-user

在MongoDB用户组(开发人员经常查看)上发布此问题

答案 4 :(得分:0)

更新不会删除文档。实际上,您运行的更新符合您的预期,例如,如果您希望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 }

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