0

{ _id: -1, votes: -1 }私のコレクションでは、次のような複合インデックスがあります。articlesこれにより、ドキュメントを並べ替えることができます。これにより、投票数の多い記事を一番上に置き、その後に最新の記事を降順で配置できます。

問題は、カーソルがクエリを変更する順序がわからないため、必要な並べ替え順序でこのコレクションをページングする方法がわからないことです。

例えば:

Articles.find().sort('-_id -votes').skip(20).limit(30)

mongodb はそのクエリのドキュメントをどのように返しますか? ドライバーでコマンドが実行される順序に基づいてカーソルを変更しますか、それとも並べ替えの前に制限が発生するように並べ替えますか?

4

2 に答える 2

4

まず、Tyler が指摘したように、最初に投票で並べ替えたい場合は、インデックスを "votes: -1" で開始する必要があります。

次に、主な質問に答えます。カーソルから結果を取得する前に適用する限り、sort()、skip()、および limit() を適用する順序は関係ありません。これらを使用するクエリは、常に最初に並べ替え、次にスキップし、制限で指定された数のドキュメントを返します。

したがって、クエリ "Articles.find().sort({votes: -1}).skip(20).limit(10)" は、投票数の多い 20 件の記事をスキップし、その後 10 件を返します。しかし、"Articles.find().sort({votes: -1}).limit(10).skip(20)" は同じ結果を返します! あなたの特定の例では、20 をスキップし、その後 30 のドキュメントを返します。

詳細については、ドキュメントをご覧ください: http://docs.mongodb.org/manual/core/read-operations/

于 2013-09-16T19:05:30.380 に答える
1

インデックスとソートが間違っているようです。あなたが欲しいと思うのは、投票(降順)、次に_id(降順)でソートされた記事です。

{votes: -1, _id: -1}

このように並べ替えると、作成順に (最も多い) 投票で並べ替えられた記事が表示されます。

于 2013-09-16T18:48:29.047 に答える