2012-01-21 8 views
0

私はさまざまな異なるクエリでカスタム検索を行う必要がある膨大な量のドキュメントを持つコレクションを持っています。 各ドキュメントにはブール値のプロパティがあります。それを "isInTop"としましょう。 すべてのクエリでこのプロパティを最初に持つドキュメントを表示する必要があります。 はい。最初にMongoDBの特定のプロパティを持つドキュメントを表示する最も速い方法

.sort({ isInTop: -1 }); 

フィールドの最後のフィールドとして「isInTop」フィールドを使用して適切なインデックスを作成します。しかし、これはゆっくりと働くでしょう。indexes in mongo works best with unique fieldsです。 各クエリの上にフィールド "isInTop"を持つドキュメントを表示するソリューションはありますか?

ここには2つの解決策があります。 最初に、「future」から_idの先頭にある必要があるドキュメントを設定します。ご存じのように、ObjectIdにはタイムスタンプが含まれています。だから、私は将来のタイムスタンプでObjectIdを作成して使用することができますnatural order

2番目:Ducumentsのために別のコレクションを作成する必要があります。そして、最初にクエリを実行します。

この問題には他に解決策がありますか?どのようなfaterを働かせますか?

更新 ランクを表すカスタムフィールドの並べ替えでこの問題が発生しました。

答えて

2

_idフィールドのトリックを使用すると、ある時点で特別な時間に到達し、_idフィールドを変更することができないという問題があります(新しいドキュメントを挿入して古いドキュメントを削除することはできません)。

あなたが気にしているものだけを保持する特別なコレクションを作成するのがおそらく最適なオプションです。それはあなたに論理的に(ある程度、物理的に)文書を分離する能力を与えます。

mongodbで新たに導入されたのは、あなたのニーズを満たす「疎」インデックスのサポートです。特別なものにしたいときだけ "isInTop"フィールドを設定し、通常は単一のインデックス付きブールフィールド(btrees)で問題を持たないスパースインデックスを作成することができます。

+0

素晴らしい。良い答えと非常に有用なmorphiaを作成していただきありがとうございます。 – vacuum

+0

私は特別なコレクションの作成について質問があります。 1つのコレクションで動作する既存のコードが多い場合、両方のコレクションを扱うにはどうすればよいですか? – vacuum

関連する問題