在我的程序中,通过update编写mongodb的十个进程(key,doc,upsert = true)
“key”是mongodb索引,但不是唯一的。
query = {'hotelid':hotelid,“抵达”:到达,“leavedate”:leavedate}
where =“data。%s”%sourceid
data_value_where = {where:value}
self.collection.update(查询,{ '$集':data_value_where},真)
“查询”id是非唯一索引
我发现有时更新不会更新存在的数据,而是创建新数据。
我写了一个更新方法返回的日志,返回的是“{u'ok':1.0,u'err':无,你没有'':'ObjectId('5245378b4b184fbbbea3f790'),u'singleShard':你' rs1 / 192.168.0.21:10000,192.168.1.191:10000,192.168.1.192:10000,192.168.1.41:10000,192.168.1.113:10000',u'connectionId':1894107,u'n':1,u'updatedExisting ':False,u'lastOp':5928205554643107852L}“
我修改了更新方法以更新(查询,{'$ set':data_value_where},upsert = True,safe = True),但这个问题没有变化。
答案 0 :(得分:0)
你可以称它为“线程安全”,因为更新本身不是用Python完成的,而是在mongodb中,它是为了同时满足许多请求而构建的。
总而言之:你可以安全地做到这一点。
答案 1 :(得分:0)
由于您使用的是运营商,您最终不会得到重复的文件。您实际上正在使用原子运算符进行更新。
Atomic(不要混淆这里所有或没有的SQL原子操作)操作是按顺序完成的,因此每个进程永远不会拾取过时的文档,或者被允许将两个id写入同一个数组,因为每个文档{ {1}}操作提取将具有上一个$set
的结果。
您确实获得重复文档的事实很可能意味着您的代码中存在错误。