好的,所以我正在尝试向我的网站推出一个小更新。一个更新包括查询可能存在或可能不存在的字段。这不能按我的意愿工作,所以我决定这样做,以便该字段始终存在于我的数据库中。我在MongoDB shell中使用了这一行:
> db.entries.update({Published: null},{$set: {Published: true}},false,true);
现在,我还没有完全理解这是如何导致删除Published为null的每个入口对象。我的意思是,它确实被删除了。我尝试查找一些ID,.findOne将为它们返回null。
这条线如何运作?我认为将发布的每个条目都为null(不存在),并将Published设置为true。
答案 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)
答案 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 }
必须有另一个操作执行删除操作。日志中可能有它的记录(或者可能没有...它取决于它花了多长时间)。从这里的信息中可以看出是什么导致了删除,但更新不是这里的罪魁祸首。