2012-03-10 7 views
1

キャッシュストアとしてキャップ付きコレクションを使用したいと思います。複合インデックス(キーと有効期限)を使用して選択する予定です。キャップ付きのコレクションから更新/削除することは不可能なので、新しい有効期限の新しいエントリを追加し、将来の有効期限のあるものを選択します。キャッシュされたコレクション - BsonId、一意性およびインデックス

1)クエリでQuery.GTE("expiry", DateTime.Now)を使用する場合は、これをインデックス作成の最適な方法ですか?

cacheColl.EnsureIndex(new IndexKeysBuilder().Ascending("key").Descending("expiry")); 

2)クラスに[BsonId]属性が必要ですか?私は "キー"はユニークではないことを知っています。レコードに一意のIDエントリが必要ですか?

3)キャッシュされたコレクションを使用する私の唯一の動機は、キャッシュの最終サイズ(ディスクとメモリの両方)を制限し、期限切れのキャッシュ項目を自分で削除する必要がないことです。定期的なコレクションとアイテムの更新/期限切れのアイテムの削除を好む理由はありますか?ドキュメントを削除しても、スペースが解放されていないことを読んでいます(コンパクトにする必要がありますか?)

答えて

0

1)インデックスは正しく表示されます。また、最新のものだけを気にしている場合は、降順ソートを追加して、クエリに1を制限することもできます。

2)いいえ。キャップ付きのコレクションでは、_idは自動的に作成されないため必須ではありません。通常のコレクションで一意である必要がある理由は、_idの一意索引がデフォルトでそのコレクションに対して作成されるためです。

3)両方のアプローチに賛否両論があり、どちらが良いかは、あなたのニーズに完全に依存しています。キャップ付きコレクションについて考慮する必要があることの1つは、作成したコレクションのサイズ変更が容易ではないことです。これは、最初に設定したサイズが小さすぎて、必要なタイムフレームウィンドウに収まらないことが後で分かった場合に問題になります。

P.S.削除されたドキュメントのエクステントで使用されていたスペースが解放されていない部分については、あなたは正しいです。しかし、Mongoはこれらのエクステントを追跡し、可能な限りそれらを再利用します。

関連する問題