これを実現する方法は他にもありますが、1つの方法は、ドキュメントをバージョン管理し、ユーザーが以前に読んだバージョンに対してのみ更新を発行することです(つまり、最後に読んだ後で他のユーザーがドキュメントを更新していないことを確認します)。 pymongoを使用したこの手法の簡単な例を次に示します。
>>> db.foo.save({'_id': 'a', 'version': 1, 'things': []}, safe=True)
'a'
>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing1'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}
上記のキー「n」は1であり、ドキュメントが更新されたことを示します
。>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': False, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 0}
ここでは、間違ったバージョンに対して更新しようとしましたが、キー「n」は0です
>>> db.foo.update({'_id': 'a', 'version': 2}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}
>>> db.foo.find_one()
{'things': ['thing1', 'thing2'], '_id': 'a', 'version': 3}
この手法は安全な書き込みの使用に依存していることに注意してください。そうしないと、更新されたドキュメントの数を示す確認応答が得られません。これのバリエーションでは、 findAndModify
を使用します。
コマンド。ドキュメントを返すか、None
(Pythonの場合)クエリに一致するドキュメントが見つからなかった場合。 findAndModify
ドキュメントの新しいバージョン(つまり、更新が適用された後)または古いバージョンのいずれかを返すことができます。