0

簡単な質問です。

MongoDB データベースで実行する更新コマンドがいくつかあります。これらは、ユーザーが多数のタスクを完了し、すべての更新をサーバーにプッシュした後に発生します。いくつかのコレクションのいくつかのドキュメントを更新します。

これらの更新がアトミックであり、他の同時クエリや他のユーザーからのコマンドが干渉できないことを保証したい場合、クエリを で分離でき;ますか?

簡単な例:

db.cities.find({"asciiname":"Zamin Sukhteh"});db.cities.find({"asciiname":"Konab-e Vasat"})

上記の結果は、2 つの別個のアトミック クエリになりますか?

4

1 に答える 1

1

区切り文字を使用してシェル内のコマンドを分離してアトミック性を導入することはできませんが、db.evalを使用することはできます。

シェル(コメントで述べた)のみを使用している場合は、db.eval関数を使用して、JavaScriptコードのブロックを実行しながらデータベース全体のロックを実行できます。これは通常は実行したいことではありませんが(デフォルトではすべての書き込みと読み取りをブロックするため)、上記で説明している場合(ここでもコメント)、ニーズに合うように思えます。

db.eval( function() {
    var one = db.cities.find({"asciiname":"Zamin Sukhteh"});
    var two = db.cities.find({"asciiname":"Konab-e Vasat"});
    // other work ...
});

更新(コメントに対処するため):

MongoDBで効率的なアトミック(のような)更新が必要な場合は、いくつかのオプションがあります。

  1. すべてを1つのドキュメントにまとめます。これはMongoDBでアトミックであることが保証されています。ただし、これは複雑なドキュメントモデル(または大きなドキュメント)では機能しないことがよくあります。
  2. ドキュメントに依存関係がある場合は、依存するドキュメントの新しい「バージョン」を配置することを検討し、それらがすべて設定された後でのみ、それらのドキュメントをリンクする最終的なドキュメントをDBに配置します。最後の「リンク」がないと、古いドキュメントに新しいバージョンが表示されないはずです。データの消費方法によっては、古いバージョンを非常に迅速に(または必要に応じて定期的に)削除できる可能性があります。
  3. 不一致がときどき発生することを受け入れ、それらを検出します(その後、クエリを再実行して新しいデータを取得します)。ドキュメント構造をトラバースするときに、タイムスタンプまたはバージョンを使用してこれらのケースを識別できる場合があります。
  4. 一般的なクエリの完全な構造としてデータを他の場所にキャッシュする
  5. MongoDBが要件に適していないことを確認します。
于 2013-02-03T19:35:33.997 に答える