mongodb 更新匹配文档失败

mongodb update matched doc fail

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

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

因为 mongoimport 无法指定数据类型,所以像“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导入的文档,而没有修改我手动插入的文档,为什么?

这不是失败,而是设计使然。

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 作为发生这种情况的证据。

所以这里的简短情况是,如果您有 "manually inserted" 个属于您正在修改的正确类型的项目,那么它们不会被更改。