Mongoデータベースでのスナップショットクエリ

Based on v26

このドキュメントはスナップショットクエリについて書かれています。データベースのバックアップスナップショットについては、 see the fsync lock page を参照してください。

パフェーマンス的な理由から、MongoDBは、完全なコレクションのpoint-in-timeなスナップショットをサポートしていません。  (将来的には変わるかもしれません。)   しかし、下記に述べるいくつかの機能はあります。

カーソル

MongoDBのクエリは、データと同時に、さらなる検索のためのカーソルIDを返します。  各ドライバーはさらにデータが必要なとき"getMore"オペレーションを動的に実行します。  データベースコレクションに書き込みがあった場合(たとえば、insert/update/delete)に、カーソルは潜在的なgetMoreをすることがあります。

概念的に、カーソルは現在の位置、を持っています。もし現在の位置のアイテムが削除されたら、カーソルは自動的に現在の位置を飛ばし、次のアイテムへ行きます。

MongoDBのカーソルは、スナップショットではありません。 カーソルが作成後に他の書き込みが発生した場合、アプリケーションが結果を見ようとした場合、結果は不明です。実際(起こりにくいですが)、オブジェクトがアップデートされ、サイズが増えた場合(データベースファイル内を移動するので)、同じオブジェクトを2度返す可能性すらあります。アップデートでの重複が起こらないことを保証するためには、snapshot()モードを使ってください(下記)。

スナップショットモード

snapshot() モードは、クエリーが存在している間、オブジェクトが一度しか返されないことを保証します。これは、find-and-updateをするようなループで、ドキュメントのサイズが変わるようなことをするときにとても重要です。($incはサイズを変えません)。

> // mongo shell example
> var cursor = db.myCollection.find({country:'uk'}).snapshot();

スナップショットモードでも、クエリ中の、アイテムの追加や削除は含まれていたり含まれなかったりします。このモードは、本当のpoint-in-timeなスナップショットではないからです(現在のところ)。

本当のpoint-in-timeなスナップショットは

本当のpoint-in-timeなスナップショットは小さいクエリのレスポンス(1MB未満)に起こることに注意してください。

スナップショットモードは、 _id インデックスを探査するので、sortや、明示的なヒントは使われないかもしれません。また、クエリの他のインデックスも使うことができません。

同じことを、変更されることがないユニークインデックスがついたフィールドを使ってすることができます(おそらく、hint()も明示的に使うことが一番でしょう)。 ユニークでないインデックス(たとえば作成日日時)を使いたい場合、 作成日時のインデックスに _id を加えることでユニークにすることができます。

参照


Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.

These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group.

blog comments powered by Disqus