「ページング」の一般的な概念は、.skip()
を使用することです。 これは、すでに取得された結果を本質的に「スキップ」するため、本質的にこれを行うことができます:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
しかし、実際には、ご想像のとおり、いくつかの「ページ」を取得すると、これはかなり遅くなります。したがって、よりスマートなものが本当に必要です。基本的に、これは、取得された最後の結果セットよりも高い(または降順の場合は低い)結果を取得する「範囲クエリ」です。したがって、5
の最後の値が与えられます 次に、あなたが行うよりも多くの場合:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
見た目は大丈夫ですが、実際にはまだ問題があります。次の「ページ」にも評価5の結果が含まれている場合はどうなりますか?このクエリはそれらをスキップし、表示することはありません。
賢明なことは、すべての_id
を「保持」することです。 一意のキーであるため、ドキュメントの値。基本的に同じ種類のものを適用しますが、今回は前のページの結果を新しいページに含めないようにします。 $nin
オペレーターはここで役立ちます:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
seenIds
かどうか は結果の最後のページであるか、それ以上は並べ替える値の「密度」に依存します。もちろん、これらをセッション変数などに「保持」する必要があります。
ただし、範囲クエリは通常、最高のパフォーマンス結果であるため、これを適応させるようにしてください。