【问题标题】:mongodb update(use upsert=true) not update exists data, insert a new data?mongodb update(use upsert=true) 不更新存在数据,插入新数据?
【发布时间】:2013-09-30 12:23:54
【问题描述】:

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

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

查询 = {'hotelid':hotelid,"arrivedate":arrivedate,"leavedate":leavedate}

where = "data.%s" % sourceid
data_value_where = {where:value}
self.collection.update(query,{'$set':data_value_where},True)

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

我发现有时候更新不是更新存在的数据,而是创建一个新的数据。

我写了一个更新方法返回的日志,返回是“ {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',你'connectionId':1894107,你'n'更新': ': False, u'lastOp': 5928205554643107852L}"

我将更新方法修改为update(query, {'$set':data_value_where},upsert=True, safe=True),但是对于这个问题三是没有变化的。

【问题讨论】:

  • 谁对试图提出合法问题但英语打字能力明显有限的人投了反对票?你太无耻了。为什么不帮助 chjuheng 重写它,这样更容易理解?
  • 我修改了问题,并在上​​面写了一些日志。感谢所有重播。

标签: python mongodb pymongo


【解决方案1】:

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

原子(不要与这里的全有或全无的 SQL 原子操作混淆)操作是按顺序完成的,因此每个进程将永远不会拾取过时的文档或被允许将两个 id 写入同一个数组,因为文档每个 @ 987654321@ 操作会得到最后一个$set 的结果。

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

【讨论】:

  • 如果更新没有命中索引,是否插入日期?
  • @chjuheng 如果索引没有被命中(我没有看到你显示的这个更新中发生了这种情况)那么不,不应该插入日期
【解决方案2】:

您可以将其称为“线程安全”,因为更新本身不是在 Python 中完成的,而是在 mongodb 中,它是为一次满足许多请求而构建的。

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

【讨论】:

  • 不知情的答案:MongoDB 写入是序列化的。
  • 我在我的程序中发现,同时写入相同的数据,使用相同的密钥,并创建重复的文档,所以我不知道发生了什么。
猜你喜欢
  • 1970-01-01
  • 2019-09-07
  • 2023-02-23
  • 2020-04-25
  • 1970-01-01
  • 2020-09-24
  • 2017-10-28
  • 2014-12-29
  • 2017-05-23
相关资源
最近更新 更多