282 votes

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 .appel find ()? Je voudrais une fonctionnalité comparable à la "LIMITE s'établissait à 50 100" dans SQL.

316voto

Chris Hinkle Points 353

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' )

265voto

Thomas Points 2179

Après la prise de regarder de plus près, la Mangouste API avec les informations fournies par Rodolphe, j'ai pensé à cette solution:

MyModel.find(query, fields, { skip: 10, limit: 5 }, function(err, results) { ... });

140voto

Madhusudhan Points 1795

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
            })
        })
    })

62voto

Rodolphe Points 497

Vous pouvez enchaîner comme ça:

.find({}).sort('mykey', 1).skip(from).limit(to)

39voto

Clément Renaud Points 875

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);
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X