我使用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.
不确定这是否反驳了我的理论......
答案 0 :(得分:1)
在mongoengine中保存是原子的,但是,在保存列表时,它会将其作为 整个列表 的$set
。所以你可能会遇到竞争条件。
这就是为什么附加到列表的首选方法是执行$push
,例如:
modelObj.update(push__dataList=data)
答案 1 :(得分:0)
table_name.objects.filter(__ id = 1).update(push__fieldname = {' key':' value',' key':'值',})如果你想删除而不是拉