Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
Python mongodb更新(使用upsert=true)不更新现有数据,是否插入新数据?_Python_Mongodb_Pymongo - Fatal编程技术网

Python mongodb更新(使用upsert=true)不更新现有数据,是否插入新数据?

Python mongodb更新(使用upsert=true)不更新现有数据,是否插入新数据?,python,mongodb,pymongo,Python,Mongodb,Pymongo,在我的程序中,通过更新(key,doc,upsert=true)编写mongodb的十个过程 “键”是mongodb索引,但不是唯一的 查询={'hotelid':hotelid,“arrivedate”:arrivedate,“leavedate”:leavedate} where=“data.%s”%sourceid 数据\u值\u其中={where:value} update(查询,{'$set':数据\值\其中},True) “查询”id不是唯一的索引 我发现有时更新不存在数据,而是创建

在我的程序中,通过更新(key,doc,upsert=true)编写mongodb的十个过程

“键”是mongodb索引,但不是唯一的

查询={'hotelid':hotelid,“arrivedate”:arrivedate,“leavedate”:leavedate}

where=“data.%s”%sourceid
数据\u值\u其中={where:value}
update(查询,{'$set':数据\值\其中},True)

“查询”id不是唯一的索引

我发现有时更新不存在数据,而是创建新数据

我为update方法返回编写一个日志,返回为“{u'ok':1.0,u'err':None,u'upserted':ObjectId('5245378b4b184fbbbea3f790'),u'singleShard':u'rs1/192.168.0.21:10000192.168.1.191:10000192.168.1.192:10000192.168.1.41:10000192.168.1.113:10000',u'connectionId':1894107,u'n':1,u'updatedeexisting':False,u'lastOp':5928205554643107852L}”

我修改了update方法以进行更新(查询,{'$set':data_value_where},upsert=True,safe=True),但对于这个问题,三个方法并没有改变。

您可以将其称为“threadsafe”,因为更新本身不是在Python中完成的,而是在mongodb中完成的,它是为同时满足许多请求而构建的


总而言之:您可以安全地这样做。

由于您使用的操作员的原因,您不会得到重复的文档。实际上,您正在使用原子运算符进行更新

原子操作(这里不要与SQL原子操作混淆)操作是按顺序进行的,因此每个进程永远不会拾取一个过时的文档,也不会允许向同一数组写入两个ID,因为每个
$set
操作拾取的文档将具有最后一个
$set
的结果


您确实获得了重复的文档,这很可能意味着您的代码中有错误。

未提供信息的回答:MongoDB写入是序列化的。我发现在我的程序中,同时写入相同的数据,使用相同的密钥,并创建重复的文档,因此我不知道发生了什么。如果更新未命中索引,是否会插入日期?@chjuheng如果索引未命中(我看不到在您显示的更新中会发生这种情况),则不应插入日期。谁对试图提出合法问题的人投了否决票,但英语打字技能明显有限?你真丢脸。为什么不帮chjuheng重新写一下,这样更容易理解呢?我修改了这个问题,并在上面写了一些日志。谢谢你的重播。