¿Cómo paginar con Mongoose en Node.js?

Resuelto Thomas asked hace 13 años • 36 respuestas

Estoy escribiendo una aplicación web con Node.js y mongoose. ¿ Cómo puedo paginar los resultados que obtengo de una .find()llamada? Me gustaría una funcionalidad comparable a "LIMIT 50,100"la de SQL.

Thomas avatar Apr 04 '11 21:04 Thomas
Aceptado

Estoy muy decepcionado por las respuestas aceptadas en esta pregunta. Esto no escalará. Si lees la letra pequeña en cursor.skip():

El método cursor.skip() suele ser costoso porque requiere que el servidor recorra desde el principio de la colección o índice para obtener el desplazamiento o la posición de salto antes de comenzar a devolver el resultado. A medida que aumenta el desplazamiento (por ejemplo, el número de página anterior), cursor.skip() se volverá más lento y consumirá más CPU. Con colecciones más grandes, cursor.skip() puede quedar vinculado a IO.

Para lograr la paginación de manera escalable, combine un límite () junto con al menos un criterio de filtro, una fecha de creación se adapta a muchos propósitos.

MyModel.find( { createdOn: { $lte: request.createdOnBefore } } )
.limit( 10 )
.sort( '-createdOn' )
Chris Hinkle avatar May 13 '2014 19:05 Chris Hinkle

Después de observar más de cerca la API Mongoose con la información proporcionada por Rodolphe, descubrí esta solución:

MyModel.find(query, fields, { skip: 10, limit: 5 }, function(err, results) { ... });
Thomas avatar Apr 04 '2011 15:04 Thomas

Paginación usando mangosta, express y jade: aquí hay un enlace a mi blog con más detalles.

var perPage = 10
  , page = Math.max(0, req.params.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
            })
        })
    })
Madhusudhan avatar Feb 11 '2013 22:02 Madhusudhan