mongodb更新匹配doc失败

时间:2015-01-09 09:28:57

标签: mongodb mongodb-query mongodb-update

mongoimport导入10000个文档,_id是6个长度的随机字符串

{_id:"xxxxxx","u":0,"t":0}

因为mongoimport不能指定数据类型,所以像#34; 123456"导入为int类型。 所以我手动删除原件并重新插入它们

db.xxx.insert({_id:"123456","u":0,"t":0})

因为默认类型0是Double,所以我将它们改为int:

db.xxx.update({},{$set:{u:NumberInt(0)}},false,true)
WriteResult({ "nMatched" : 100000, "nUpserted" : 0, "nModified" : 99994 })

似乎6个文档更改失败,我通过以下方式验证更改:

> db.code.find({u:{$type:1}})
{ "_id" : "263798", "t" : 4, "u" : 0 }
{ "_id" : "375249", "t" : 7, "u" : 0 }
{ "_id" : "659472", "t" : 3, "u" : 0 }
{ "_id" : "672534", "t" : 3, "u" : 0 }
{ "_id" : "784392", "t" : 0, "u" : 0 }
{ "_id" : "875631", "t" : 0, "u" : 0 }

更新只会修改由mongoimport导入的文档,但不保留我手动插入的文档,为什么?

1 个答案:

答案 0 :(得分:3)

这不是失败,而是设计。

Bulk Operations API下,如果您提供的更新值与文档的现有值相匹配,则它不会被标记为已修改,并且实际上不会尝试重新写入文档。

简单测试:

db.junk.insert({ "a": 1 })
WriteResult({ "nInserted" : 1 })

db.junk.update({ "a": 1},{ "$set": { "a": 2 }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

db.junk.update({ "a": 2 },{ "$set": { "a": 2 }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

db.junk.update({ "a": 2 },{ "$set": { "a": NumberInt(2) }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

db.junk.update({ },{ "$set": { "a": NumberInt(2) }})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

从版本2.6开始,MongoDB shell中的所有操作实际上都使用Bulk Operations API。您可以在此处看到来自该API的WriteResult,以此作为证据。

所以这里的简短案例就是你有"手动插入"正在修改的类型正确的项目,然后它们不会被更改。