Maison >interface Web >js tutoriel >Comment implémenter une pagination efficace dans MongoDB à l'aide de _id et Forward Paging ?
Comment implémenter la pagination dans MongoDB
Bien que l'utilisation de skip soit généralement déconseillée pour la pagination en raison de sa consommation de mémoire à grande échelle, une approche alternative est pour exploiter le champ _id pour un ordre naturel.
Obtenir le _id du dernier document
Pour obtenir le _id du dernier document sur une page donnée, vous pouvez utiliser ce qui suit approche :
<code class="javascript">db.users.find().limit(pageSize); //Find the id of the last document in this page last_id = ...;</code>
Paging avant
Plutôt que d'utiliser .skip() et .limit(), la pagination avant implique de parcourir le curseur et de stocker le dernier vu _identifiant. Lors des itérations suivantes, la requête est modifiée pour exclure les documents déjà vus, tout en limitant également les résultats à ceux dont le _id est inférieur ou égal à la dernière valeur vue.
Pour un ordre naturel par _id, le code ressemblerait à ceci :
<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>
Requête modifiée pour les pages suivantes
La requête suivante est utilisée pour récupérer la page suivante :
<code class="javascript">var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);</code>
Tri complexe
Pour trier par des champs autres que _id, tels que le classement, vous devez garder une trace des documents précédemment consultés et utiliser l'opérateur $nin pour les exclure.
Voici un exemple d'extrait de code pour la pagination avant avec tri par rang :
<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>
La requête suivante pour la page suivante serait :
<code class="javascript">var cursor = db.junk.find( { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen } ).sort({ "rank": -1 }).limit(2);</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!