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 に答える