Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb更新匹配的文档失败_Mongodb_Mongodb Query_Mongodb Update - Fatal编程技术网

mongodb更新匹配的文档失败

mongodb更新匹配的文档失败,mongodb,mongodb-query,mongodb-update,Mongodb,Mongodb Query,Mongodb Update,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)}},f

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导入的文档,而不修改我手动插入的文档,原因何在?

这不是失败,而是出于设计

在下,如果您提供的更新值与文档的现有值匹配,则不会将其标记为已修改,并且实际上不会尝试重新写入文档

简单测试:

db.junk.insert({“a”:1})
WriteResult({“n插入”:1})
更新({“a”:1},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({“a”:2},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
更新({“a”:2},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
从2.6版开始,MongoDB shell中的所有操作实际上都使用。这就是你从API中看到的证据,证明了这一点


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

这不是失败,而是设计上的失败

在下,如果您提供的更新值与文档的现有值匹配,则不会将其标记为已修改,并且实际上不会尝试重新写入文档

简单测试:

db.junk.insert({“a”:1})
WriteResult({“n插入”:1})
更新({“a”:1},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({“a”:2},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
更新({“a”:2},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
从2.6版开始,MongoDB shell中的所有操作实际上都使用。这就是你从API中看到的证据,证明了这一点


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

这不是失败,而是设计上的失败

在下,如果您提供的更新值与文档的现有值匹配,则不会将其标记为已修改,并且实际上不会尝试重新写入文档

简单测试:

db.junk.insert({“a”:1})
WriteResult({“n插入”:1})
更新({“a”:1},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({“a”:2},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
更新({“a”:2},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
从2.6版开始,MongoDB shell中的所有操作实际上都使用。这就是你从API中看到的证据,证明了这一点


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

这不是失败,而是设计上的失败

在下,如果您提供的更新值与文档的现有值匹配,则不会将其标记为已修改,并且实际上不会尝试重新写入文档

简单测试:

db.junk.insert({“a”:1})
WriteResult({“n插入”:1})
更新({“a”:1},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({“a”:2},{“$set”:{“a”:2})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
更新({“a”:2},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:1})
更新({},{“$set”:{“a”:numberprint(2)})
WriteResult({“nMatched”:1,“nUpserted”:0,“nModified”:0})
从2.6版开始,MongoDB shell中的所有操作实际上都使用。这就是你从API中看到的证据,证明了这一点


因此,这里的简短案例是,如果你有“手动插入”的项目是你正在修改的正确类型,那么它们不会改变。

MangGDB决定修改或不根据价值,但不考虑值的类型。这是否也适用于所有mongodb驱动程序?@jean I对“类型”案例做了更清楚的说明。但所有使用“批量API”的驱动程序都是如此,默认情况下,除非您显式调用这些方法,否则大多数驱动程序都不会使用“批量API”。标准驱动程序
.update()
方法返回一个“遗留写问题”响应,即使没有更改,也会将文档报告为已修改。shell将使用批量方法,并将您添加的具有正确整数类型和
0
值的项报告为“未修改”。您的第三次更新成功吗?无论我尝试什么,我都无法在不通过更改值的情况下更改类型mongod@jean我不知道你在这里是什么意思。你能解释得更清楚些吗。我只是演示了
WriteResult
响应是如何产生的,以及如果不需要的话,不是所有匹配的内容都会被修改。我的意思是“db.junk.update({“a”:2},{“$set”):{“a”:NumberIn