La pagination de vos données est l'une des opérations les plus courantes avec MongoDB. Un scénario typique est la nécessité d'afficher vos résultats en morceaux dans votre interface utilisateur. Si vous traitez vos données par lots, il est également important que votre stratégie de pagination soit correcte afin que votre traitement de données puisse évoluer.
Passons en revue un exemple pour voir les différentes façons de parcourir les données dans MongoDB. Dans cet exemple, nous avons une base de données CRM de données utilisateur que nous devons parcourir et afficher 10 utilisateurs à la fois. Donc, en effet, notre taille de page est de 10. Voici la structure de notre document utilisateur :
{ _id, name, company, state }
Approche 1 :Utiliser skip() et limit()
MongoDB prend en charge nativement l'opération de pagination à l'aide des commandes skip() et limit(). La directive skip(n) indique à MongoDB qu'il doit ignorer les résultats "n", et la directive limit(n) indique à MongoDB qu'il doit limiter la longueur du résultat à "n" résultats. En règle générale, vous utiliserez les directives skip() et limit() avec votre curseur, mais pour illustrer le scénario, nous fournissons des commandes de console qui obtiendraient les mêmes résultats. De plus, pour la brièveté du code, le code de vérification des limites est également exclu :
//Page 1 db.users.find().limit (10) //Page 2 db.users.find().skip(10).limit(10) //Page 3 db.users.find().skip(20).limit(10) ........
Vous avez eu l'idée. En général, pour récupérer la page "n", le code ressemble à ceci :
db.users.find().skip(pagesize*(n-1)).limit(pagesize)
Cependant, à mesure que la taille de vos données augmente, cette approche présente de sérieux problèmes de performances. La raison en est que chaque fois que la requête est exécutée, le jeu de résultats complet est créé, puis le serveur doit parcourir le début de la collection jusqu'au décalage spécifié. À mesure que votre décalage augmente, ce processus devient de plus en plus lent. De plus, ce processus n'utilise pas efficacement les index. Donc, généralement, l'approche "skip()" et "limit()" est utile lorsque vous avez de petits ensembles de données, et si vous travaillez avec de grands ensembles de données, vous voudrez envisager d'autres approches.
Approche 2 :Utiliser find() et limit()
La raison pour laquelle l'approche précédente ne s'adapte pas très bien est la commande skip(), et le but de cette section est d'implémenter la pagination sans utiliser la commande 'skip()'. Pour cela, nous allons tirer parti de l'ordre naturel dans les données stockées comme un horodatage ou un identifiant stocké dans le document. Dans cet exemple, nous allons utiliser le "_id" stocké dans chaque document. ‘_id’ est une structure MongoDB ObjectID qui est une structure de 12 octets contenant un horodatage, usiné, processid, compteur, etc. L'idée générale est la suivante :
1. Récupérer le _id du dernier document de la page en cours
2. Récupérer les documents supérieurs à ce "_id" dans la page suivante
//Page 1 db.users.find().limit(pageSize); //Find the id of the last document in this page last_id = ... //Page 2 users = db.users.find({'_id'> last_id}). limit(10); //Update the last id with the id of the last document in this page last_id = ...
Cette approche exploite l'ordre inhérent qui existe dans le champ "_id". De plus, puisque le champ "_id" est indexé par défaut, les performances de l'opération de recherche sont très bonnes. Si le champ que vous utilisez n'est pas indexé, vos performances en souffriront. Il est donc important de vous assurer que ce champ est indexé.
De plus, si vous souhaitez que vos données soient triées dans un ordre particulier pour votre pagination, vous pouvez également utiliser la clause sort() avec la technique ci-dessus. Il est important de s'assurer que le processus de tri exploite un index pour de meilleures performances. Vous pouvez utiliser le suffixe .explain() dans votre requête pour déterminer ceci :
users = db.users.find({'_id'> last_id}). sort(..).limit(10); //Update the last id with the id of the last document in this page last_id = ...
Comme toujours, si vous avez des questions ou des commentaires, n'hésitez pas à nous contacter à [email protected].