0

さまざまなクエリを使用してカスタム検索を行う必要がある膨大な量のドキュメントを含むコレクションがあります。各 Document には boolean プロパティがあります。それを「isInTop」と呼びましょう。すべてのクエリで最初にこのプロパティを持つドキュメントを表示する必要があります。はい。次のように、このフィールドで簡単に並べ替えることができます。

.sort( { isInTop: -1 } );

そして、フィールド「isInTop」を最後のフィールドとして適切なインデックスを作成します。ただし、mongo のインデックスは一意のフィールドで最適に機能するため、これはゆっくりと機能します。各クエリの上に「isInTop」フィールドを持つドキュメントを表示するソリューションはありますか?

ここには 2 つの解決策があります。最初に: "future" の _id の先頭にある必要があるドキュメントを設定します。ご存じのとおり、ObjectId にはタイムスタンプが含まれています。したがって、将来のタイムスタンプで ObjectId を作成し、自然順序を使用できます

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

この問題に対する他の解決策はありますか? どちらがよりうまく機能しますか?

更新 ランクを表すカスタムフィールドでソートしてこの問題を解決しました。

4

1 に答える 1

2

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

関心のあるものだけを保持する特別なコレクションを作成することは、おそらく最良の選択肢です。これにより、文書を論理的に (そしてある程度は物理的に) 分離することができます。

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

于 2012-01-22T15:17:42.647 に答える