記事に関する情報を格納するコレクションがあります。コレクションはアーカイブ用であるため、読み取り専用です。現在、「title」と「page_length」の 2 つのフィールドのみが使用されています。最初に長い記事を取得することに常に関心があるため、次のインデックスを用意しています: { title: 1, page_length: -1}.
コレクションが非常に大きく、メモリに収まらないため、ソートがまだ遅いことがわかりました。
このコレクションで使用するほぼすべてのクエリで sort({page_length:-1}) が必要になると仮定すると、単純にレコードを page_length の降順でディスクに格納する方法はありますか? つまり、コレクション内の最初のレコードを最大の page_length 値にし、2 番目のレコードを 2 番目に大きい値にする簡単な方法はありますか?
そうすれば、並べ替えを実行することなく、 limit(n) を使用して最初の n レコードを取得できます。何か案は?
詳細情報の更新:
これを検索のオートコンプリート機能に使用しているため、速度が重要です。私が使用してきたクエリは次のようになります。
db.articles.find({"title": /^SomeKeyword/}).sort({page_length:-1})
挿入は問題ではないので、複数のインデックスを作成できてうれしいです。読み取り速度を最大化したいだけです。
編集:参考までに、私は実際に find().forEach() を使用してコレクション内のレコードを新しいコレクションに再編成することができました。次に、コレクションを検索し、並べ替えを必要とせずに最初の N 個の結果を取得しました。これは非常にうまく機能しました。私のデータセットは決して変更されないため、これはのみ機能することに注意してください。