0

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

“键”是 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', u'connectionId': 1894107, u'n': 1, u'updatedExist , u'lastOp': 5928205554643107852L}"

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

4

2 回答 2

0

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

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

于 2013-09-25T04:16:37.697 回答
0

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

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

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

于 2013-09-25T07:18:02.143 回答