¿Cómo paginar con Mongoose en Node.js?
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.
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' )
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) { ... });
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
})
})
})