ホームページ >ウェブフロントエンド >jsチュートリアル >_id と Forward Paging を使用して MongoDB に効率的なページネーションを実装するにはどうすればよいですか?
MongoDB でページネーションを実装する方法
大規模なメモリ消費のため、ページネーションではスキップの使用は一般的に推奨されませんが、別のアプローチは次のとおりです。
最後のドキュメントの _id を取得する
特定のページの最後のドキュメントの _id を取得するには、次のコマンドを使用できます。アプローチ:
<code class="javascript">db.users.find().limit(pageSize); //Find the id of the last document in this page last_id = ...;</code>
前方ページング
.skip() と .limit() を使用するのではなく、前方ページングではカーソルを反復処理し、最後に表示されたデータを保存します。 _id.後続の反復では、クエリはすでに表示されているドキュメントを除外するように変更され、同時に最後に表示された値よりも小さいか等しい _id を持つドキュメントに結果を制限します。
_id による自然な順序の場合、コードは次のようになります。これ:
<code class="javascript">var lastSeen = null; var cursor = db.junk.find().limit(3); while (cursor.hasNext()) { var doc = cursor.next(); if (!cursor.hasNext()) lastSeen = doc._id; }</code>
後続ページの変更されたクエリ
次のクエリは次のページを取得するために使用されます:
<code class="javascript">var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);</code>
複雑な並べ替え
ランクなど、_id 以外のフィールドで並べ替える場合は、以前に表示されたドキュメントを追跡し、$nin 演算子を使用してそれらを除外する必要があります。
ここにあります。ランクによるソートによる前方ページングのコード スニペットの例:
<code class="javascript">var lastSeen = null; var seenIds = []; var cursor = db.junk.find().sort({ "rank": -1 }).limit(2); while (cursor.hasNext()) { var doc = cursor.next(); if ( lastSeen != null && doc.rank != lastSeen ) seenIds = []; seenIds.push(doc._id); if (!cursor.hasNext() || lastSeen == null) lastSeen = doc.rank; }</code>
次のページに対する後続のクエリは次のようになります:
<code class="javascript">var cursor = db.junk.find( { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen } ).sort({ "rank": -1 }).limit(2);</code>
以上が_id と Forward Paging を使用して MongoDB に効率的なページネーションを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。