sql >> データベース >  >> NoSQL >> MongoDB

MongoDBドキュメント操作はアトミックで分離されていますが、一貫性がありますか?

    これを実現する方法は他にもありますが、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 ドキュメントの新しいバージョン(つまり、更新が適用された後)または古いバージョンのいずれかを返すことができます。



    1. ハイフンやスペースなどの特殊文字で構成される文字列を照合する方法

    2. Python+MongoDB-カーソルの反復が遅すぎる

    3. MongodbMapreduceがエラーを出している

    4. ドキュメントの外部に含まれる属性に基づくMapReduce集計