mongodb update(使用upsert = true)不更新存在的数据,插入新数据?

时间:2013-09-25 04:00:11

标签: python mongodb pymongo

在我的程序中,通过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),但这个问题没有变化。

2 个答案:

答案 0 :(得分:0)

你可以称它为“线程安全”,因为更新本身不是用Python完成的,而是在mongodb中,它是为了同时满足许多请求而构建的。

总而言之:你可以安全地做到这一点。

答案 1 :(得分:0)

由于您使用的是运营商,您最终不会得到重复的文件。您实际上正在使用原子运算符进行更新。

Atomic(不要混淆这里所有或没有的SQL原子操作)操作是按顺序完成的,因此每个进程永远不会拾取过时的文档,或者被允许将两个id写入同一个数组,因为每个文档{ {1}}操作提取将具有上一个$set的结果。

您确实获得重复文档的事实很可能意味着您的代码中存在错误。