1

mongo を使用したページネーションにはすでにいくつかのパターンがあることはわかっていました (いくつかのドキュメントではskip()、多くのドキュメントでは範囲指定されたクエリ) が、私の状況ではライブ ソートが必要です。

アップデート:

明確にするために、質問のポイントを変更します。次のようなクエリを作成できますか:

db.collection.find().sort({キー: 1}).limit(n).sort({キー: -1}).limit(1)

主なポイントは、クエリを「通常の」順序でソートし、返されるデータセットを制限してから、ソートでこれを逆にして、ページ分割されたデータの最後のインデックスを取得することです。私はこのアプローチを試しましたが、mongo はどうにかしてクエリを最適化し、最初の sort() 演算子を無視しているようです。

4

1 に答える 1

1

あなたの質問を理解するのに大きな問題があります。

ユーザーがページを更新したとき、たとえば 6 時間後にわかることから、そこにあった結果だけでなく、現在ある結果も表示されるはずです。

@JohnnyHKが言うように、MongoDBは自然に「ライブ」ソートを行うため、これが当てはまり、MongoDBの場合、クエリにより正しい結果が返されます。

ここであなたが理解しようとしている問題の 1 つ (質問には明確な説明が必要です) は、データの変更により、最後_idに見たページ番号など、または情報の多様性さえも正確に表していない可能性があることです。つまり、最後_idに見たのは、実際には 13 ページの途中です。

この種のものは、ユーザーに長い間AFAKであることを理解させるだけでなく、解決しようとするより多くの時間とパフォーマンスを費やすことになるでしょう.

編集

ああ、あなたが今何をしようとしているのか、ページとリストの最後のアイテムの両方を同時に取得することで卑劣になろうとしていることがわかると思います。残念ながら、SQL と同様にこれは不可能です。並べ替えがそのように機能したとしても、単一のフィールドで一方向にしか並べ替えることができないため、並べ替えは本来のようには機能しません。

ただし、将来の参考のために、関数はカーソルのsort()関数とまったく同じであり、反復を開始して実際にカーソルを開くまで、sort()複数回呼び出すとカーソルプロパティが上書きされます。

恐れ入りますが、これは 2 つのクエリで実行する必要があるため、最初にページを取得してからクライアント側 (そのページの最大値を探していると思います) をスクロールして最後のレコードを見つける_idか、単に 2 番目のクエリを実行して、最後の を取得し_idます。それは超高速である必要があります。

于 2012-12-16T19:19:34.937 に答える