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导入的文档,但不保留我手动插入的文档,为什么?
答案 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
,以此作为证据。
所以这里的简短案例就是你有"手动插入"正在修改的类型正确的项目,然后它们不会被更改。