django - 如何使用 mongoengine 避免竞争条件(对 ListFields 和 DictFields 进行原子更改)

标签 django mongodb pymongo mongoengine

我正在使用 mongoengine,似乎遇到了一些潜在的竞争条件事件。作为一个简单的例子,我们有这样的代码

def changeModel(newitemL, olditemD)
    model.randomList.append(newitemL)
    model.randomDict.pop(olditemD,None)
    model.save()

因此,如果两个用户尝试使用不同的项目执行此操作,那么有时它只会显示 1 个用户对已保存模型的更改。有没有一种方法可以自动更改 ListFields 和 DictFields 来避免这种情况?

最佳答案

与其进行保存,不如进行更新,例如:

model.update(push__randomList=newitemL, pop__randomDict)

这样您只会以原子方式影响这些元素。

目前,mongoengine 在保存列表/字典字段时简单而天真,例如:

model.randomList.append(newitemL)

# Converts to a set of the whole list:
model.update(set__randomList=model.randomList)

关于django - 如何使用 mongoengine 避免竞争条件(对 ListFields 和 DictFields 进行原子更改),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17686753/

相关文章:

python - 如何在 Django 中按 "application instance"使用不同的数据库?

Node.js + mongoDB,mongojs $in 运算符出错

python - 对 PyMongo 查询的结果进行排序

python - Django:在基于类的 View 中使用分页随机化查询集

mysql - 无法连接到 '127.0.0.1' (10061) 上的 MySQL 服务器

django-dynamic-formset 和 django-autocomplete-light 集成错误

ruby-on-rails - ruby rails : Concatenate results of Mongoid criterias and paging

java - JPQL - 我如何搜索键和值的实体(Hibernate OGM (MongoDB) - Map<String, String>)

mongodb - 如何使用列表中的包含查询mongoengine?

python - PyMongo 通过多个值查找