Python mongodb更新(使用upsert=true)不更新现有数据,是否插入新数据?
在我的程序中,通过更新(key,doc,upsert=true)编写mongodb的十个过程 “键”是mongodb索引,但不是唯一的 查询={'hotelid':hotelid,“arrivedate”:arrivedate,“leavedate”:leavedate} where=“data.%s”%sourceidPython 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不是唯一的索引 我发现有时更新不存在数据,而是创建
数据\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重新写一下,这样更容易理解呢?我修改了这个问题,并在上面写了一些日志。谢谢你的重播。