Django Mongoengine并发存储失败

时间:2013-04-25 22:20:01

标签: python django mongodb mongoengine

我使用Mongoengine在Django上运行了一个Web API,它执行以下操作

print "Saving", data
modelObj.dataList.append(data)
modelObj.save()

我还有一个API,它在一个非常紧凑的循环中调用这个函数,导致以下日志:

Saving {'answer': u'3'}
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 10
Saving {'answer': u'2'}
Saving {Saving {'answer': u'5'}}
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 30
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 30
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 10
Saving {'answer': u'1'}
[25/Apr/2013 17:12:00] "POST /submit HTTP/1.1" 200 10
显然,豁免正在同时发生。输出是我很少看到所有5个结果被写入数据库。我在这里忽略了一些非常重要的东西吗?

更新:使用Mongoengine 0.7.9。文档说:

Changed in version 0.5: In existing documents it only saves changed fields using  
set / unset. Saves are cascaded and any DBRef objects that have changes are saved as well.

不确定这是否反驳了我的理论......

2 个答案:

答案 0 :(得分:1)

在mongoengine中保存是原子的,但是,在保存列表时,它会将其作为 整个列表 $set。所以你可能会遇到竞争条件。

这就是为什么附加到列表的首选方法是执行$push,例如:

modelObj.update(push__dataList=data)

答案 1 :(得分:0)

table_name.objects.filter(__ id = 1).update(push__fieldname = {' key':' value',' key':'值',})如果你想删除而不是拉