0

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 导入的文档,但不保留我手动插入的文档,为什么?

4

1 回答 1

3

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

批量操作 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 中的所有操作实际上都在使用批量操作 API。在这里,您可以看到WriteResult来自该 API 的内容,以证明这种情况正在发生。

因此,这里的简短情况是,如果您“手动插入”的项目属于您要修改的正确类型,那么它们不会被更改。

于 2015-01-09T09:31:59.457 回答