2013-09-25 153 views
0

在我的程序中,通过更新(key,doc,upsert = true)写入mongodb的十个过程mongodb更新(使用upsert = true)不更新存在数据,插入新数据?

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

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

其中= “数据%S。” %的SourceID
data_value_where = {其中:value}
self.collection.update(查询,{ '$集':data_value_where},真)

“查询” 的id不是唯一的指标

我发现有时更新不更新存在数据,但创建新数据。

我为update方法返回一个日志,返回值为“{u'ok':1.0,u'err':None,u'upserted':ObjectId('5245378b4b184fbbbea3f790'),u'singleShard':u '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'我更改了更新方法(query,{'$ set':data_value_where},upsert = True,safe = True),但是三个没有改变对于这个问题。

+3

谁降低了某人试图提出一个合法的问题,但显然有限的英语打字技巧?真丢脸。为什么不帮助句容重写它,因此它更容易理解? –

+0

@DanGayle谢谢 – chjuheng

+0

我修改了这个问题,并在上​​面写了一些日志。感谢所有的重播。 – chjuheng

回答

0

你可以称之为“线程安全”,因为更新本身不是在Python中完成的,而是在mongodb中,它是为一次处理多个请求而构建的。

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

+0

Uninformed answeres:MongoDB写入被序列化。 –

+0

我在我的程序中发现,同时写入相同的数据,使用相同的密钥,并创建重复的文档,所以我不知道发生了什么。 – chjuheng

0

由于您使用的操作符,您不会因为重复的文档而结束。你实际上使用一个原子操作符来更新。

原子(不要与SQL中的所有或全部原子操作相混淆)操作按顺序完成,因此每个进程永远不会拿起陈旧的文档或被允许将两个id写入同一个数组,因为每个文档都是$set操作拾取将会产生最后的$set的结果。

事实上,您获取重复文档最有可能意味着您的代码中存在错误。

+0

如果更新未命中索引,是否会插入日期? – chjuheng

+0

@chjuheng如果索引没有被触发(其中我没有看到发生在这个更新中的事件,那么你会显示),那么不,不应该插入日期 – Sammaye