Comment paginer avec la Mangouste dans Node.js?
Je suis en train d'écrire une webapp avec Node.js et la mangouste. Comment puis-je paginer les résultats que j'obtiens à partir d'un .find()
appel? Je voudrais une fonctionnalité comparable à "LIMIT 50,100"
en SQL.
- Utilisez le saut et la limite de propriété, tandis que la recherche de données de la collection.
Vous devez vous connecter pour publier un commentaire.
Je suis très déçu par les réponses acceptées dans cette question. Ce ne sera pas à l'échelle. Si vous lisez les petits caractères sur le curseur.skip( ):
Pour atteindre la pagination dans une évolutive façon de combiner une limite( ) avec au moins un critère de filtre, un createdOn date convient à de nombreuses fins.
-createdOn
', vous pouvez remplacer la valeur derequest.createdOnBefore
avec le moins de valeur decreatedOn
retourné dans le résultat précédent, puis actualisez.createdOn
, de sorte qu'ils seront repris dans la suite et aussi il n'y a pas de possibilité d'aller à la page N cause il n'y a pas d'information concernantrequest.createdOnBefore
pour démarrer la N de la page.Après la prise de regarder de plus près, la Mangouste API avec les informations fournies par Rodolphe, j'ai pensé à cette solution:
skip
à faire de la pagination?La Pagination à l'aide de la mangouste, l'express et de jade - http://madhums.me/2012/08/20/pagination-using-mongoose-express-and-jade/
Math.max(0, undefined)
sera de retourundefined
, Cela a fonctionné pour moi:let limit = Math.abs(req.query.limit) || 10;
let page = (Math.abs(req.query.page) || 1) - 1;
Schema.find().limit(limit).skip(limit * page)
Vous pouvez enchaîner comme ça:
L'exécution de la requête à l'aide de
exec
var page = req.param('p'); var per_page = 10; if (page == null) { page = 0; } Location.count({}, function(err, count) { Location.find({}).skip(page*per_page).limit(per_page).execFind(function(err, locations) { res.render('index', { locations: locations }); }); });
Vous pouvez utiliser un petit paquet appelé Mangouste Paginer qui la rend plus facile.
Après dans vos itinéraires ou le contrôleur, il suffit d'ajouter :
Mieux vaut tard que jamais.
Dans ce cas vous pouvez ajouter la requête
page
et/oulimit
de votre url http. Exemple de?page=0&limit=25
BTW
La Pagination commence avec
0
mongoose
.isLastPage:false|true
"Load more"
bouton, puis il suffit de charger les pages. Si le résultat est vide alors que c'est la fin. Masquer le bouton. C'est la meilleure façon que je peux suggérer.Ceci est un exemple de exemple, vous pouvez essayer ce,
Essayez d'utiliser la mangouste fonction de la pagination. Limite est le nombre d'enregistrements par page et le numéro de la page.
C'est ce que j'ai fait sur le code
Qui est de savoir comment j'ai fait.
Voici une version que j'accorde à tous mes modèles. Il dépend de soulignement pour des raisons de commodité et asynchrone pour la performance. Le opte permet de champ de sélection et de tri à l'aide de la mangouste syntaxe.
Joindre à votre schéma de modèle.
La plus simple et la plus rapide est, paginer avec l'objectId
Exemple;
Initiale de l'état de charge
Prendre le premier et le dernier ObjectId à partir des données de réponse
Page suivante condition
Page suivante condition
Dans mangouste
La meilleure approche (OMI) est d'utiliser le saut et limite, MAIS dans des collections ou des documents.
De faire la requête sur un nombre limité de documents, nous pouvons utiliser des index comme indice sur un champ de type DATE. Voir qu'en dessous de
Plus simple plugin pour la pagination.
https://www.npmjs.com/package/mongoose-paginate-v2
Ajouter un plugin à un schéma et modèle d'utilisation de la pagination de la méthode:
Ceci est un exemple de fonction pour obtenir le résultat du modèle de la pagination et de limiter les options
}
La réponse ci-dessus est valable.
Simple et puissant de la pagination solution
last_doc_id
: le dernier id de document que vous obtenezno_of_docs_required
: le nombre de documents que vous souhaitez chercher à savoir 5, 10, 50, etc.vous pouvez utiliser la ligne de code suivante ainsi
ce code fonctionnera dans la dernière version de mongo
Vous pouvez écrire des requêtes de ce genre.
page : numéro de la page à venir à partir d'un client comme les paramètres de la demande.
per_page : pas de résultats affichés par page
Si vous utilisez la MOYENNE de la pile blog suivant fournit une grande partie de l'information pour créer de la pagination dans l'extrémité avant à l'aide de angular-UI bootstrap et à l'aide de la mangouste sauter et de limiter les méthodes dans le backend.
voir : https://techpituwa.wordpress.com/2015/06/06/mean-js-pagination-with-angular-ui-bootstrap/
Vous pouvez soit utiliser skip() et (limite), mais c'est très inefficace. Une meilleure solution serait un tri sur un champ indexé plus limite().
Nous avons à Wunderflats ont publié une petite lib ici: https://github.com/wunderflats/goosepage
Il utilise la première méthode.
Si vous utilisez de la mangouste comme source d'une api restful ont un coup d'oeil à
'restify-mangouste", et à ses requêtes. Il a exactement cette fonctionnalité intégrée.
Une requête sur une collection fournit les en-têtes qui sont utiles ici
Donc, fondamentalement, vous obtenez un serveur générique avec un relativement linéaire du temps de chargement pour les requêtes pour les collections. C'est génial et quelque chose à regarder si vous voulez aller dans un propre mise en œuvre.
A été en mesure d'obtenir des résultats avec async/await ainsi.
Exemple de Code ci-dessous à l'aide d'un async gestionnaire avec hapi v17 et de la mangouste v5