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 .appel find ()? Je voudrais une fonctionnalité comparable à la "LIMITE s'établissait à 50 100" dans SQL.
Réponses
Trop de publicités?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( ):
Le curseur.skip() la méthode est souvent coûteuse, car elle nécessite que le serveur marche depuis le début de la collecte ou de l'index pour obtenir le décalage ou de sauter avant de commencer à retourner le résultat. En tant qu'offset (par exemple pageNumber ci-dessus) augmente, curseur.skip() deviendra plus lent et plus intensif du CPU. Avec de grandes collections, curseur.skip() peut devenir IO lié.
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.
MyModel.find( { createdOn: { $lte: request.createdOnBefore } } )
.limit( 10 )
.sort( '-createdOn' )
La Pagination à l'aide de la mangouste, l'express et de jade - http://madhums.me/2012/08/20/pagination-using-mongoose-express-and-jade/
var perPage = 10
, page = Math.max(0, req.param('page'))
Event.find()
.select('name')
.limit(perPage)
.skip(perPage * page)
.sort({
name: 'asc'
})
.exec(function(err, events) {
Event.count().exec(function(err, count) {
res.render('events', {
events: events,
page: page,
pages: count / perPage
})
})
})
Vous pouvez utiliser un petit paquet appelé Mangouste Paginer qui la rend plus facile.
$ npm install mongoose-paginate
Après dans vos itinéraires ou le contrôleur, il suffit d'ajouter :
/**
* querying for `all` {} items in `MyModel`
* paginating by second page, 10 items per page (10 results, page 2)
**/
MyModel.paginate({}, 2, 10, function(error, pageCount, paginatedResults) {
if (error) {
console.error(error);
} else {
console.log('Pages:', pageCount);
console.log(paginatedResults);
}
}