0

我有一个使用 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.

不知道这是否反驳了我的理论......

4

2 回答 2

1

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

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

modelObj.update(push__dataList=data)
于 2013-04-26T09:12:54.763 回答
0

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

于 2015-05-29T13:07:56.833 回答