2012-09-22 14 views
9

Quiero hacer una función de paginación en mi Colección. ¿Cómo se pueden encontrar documentos con posiciones de "inicio" y "límite" y obtener el número total de documentos en una sola consulta?Cómo hacer la paginación con mangosta

Respuesta

18

No se puede obtener tanto en una consulta; lo mejor que puede hacer es conseguir que ambos usando una mangosta Query objeto:

var query = MyModel.find({}); 
query.count(function(err, count) {...}); 
query.skip(5).limit(10).exec('find', function(err, items) {...}); 

usen una estructura de control de flujo como async para ejecutar limpiamente en paralelo si es necesario.

+0

Gracias! Funciona bien para mí – Erik

+1

Cuando ejecuto esto, el ejecutivo en la segunda consulta devuelve lo mismo que el recuento ... ¿La función de conteo modifica la consulta original? –

+1

@ZekeAlexandreNierenberg Tienes razón, Zeke; eso debe haber cambiado como un punto. Actualicé el ejemplo para agregar el parámetro ''find'' a la llamada' exec' para que funcione con Mongoose 3.6.20. – JohnnyHK

1

ACTUALIZACIÓN:

El uso de saltar y el límite no es bueno para la paginación. Here is the discussion over it.

@Wes Freeman, Dio una buena respuesta. Leí la pose vinculada, debes usar la consulta de rango. n = 0; i = n + 10; db.students.find ({"id": {$ gt: n, $ lt: (n + i)}});

vieja respuesta (no utilice este)

usar algo como

n = db.students.find().skip(n).limit(10); 
//pass n dynamically, so for page 1 it should be 0 , page 2 it should be 10 etc 

más documentación en http://www.mongodb.org/display/DOCS/Advanced+Queries

+0

Gracias por la respuesta, pero es necesario obtener el recuento total de documentos. – Erik

+0

total = db.students.find(). Count() –

+0

Wes Freeman, dio una buena respuesta. Leí la pose vinculada, debes usar la consulta de rango. n = 0; i = n + 10; db.students.find ({"id": {$ gt: n, $ lt: (n + i)}}); –

3

Si va a tener muchas páginas, no debe usar omitir/limitar, sino calcular rangos.

respuesta

Sede de Scott como una pregunta similar: MongoDB - paging

6

Usted puede utilizar el plugin Mongoose Paginate:

$ npm install mongoose-paginate 

Después de sus rutas o controlador, sólo tiene que añadir:

Model.paginate({}, { page: 3, limit: 10 }, function(err, result) { 
    // result.docs 
    // result.total 
    // result.limit - 10 
    // result.page - 3 
    // result.pages 
}); 
0
user.find({_id:{$nin:friends_id},_id:{$ne:userId}},function(err,user_details){ 
    if (err) 
    res.send(err); 
    response ={ 
     statusCode:200, 
     status:true, 
     values:user_details 
    } 
    res.json(response); 
    }).skip(10).limit(1); 
+3

Su respuesta puede ser la correcta, pero intente agregar más contexto a su código para ayudar a todos los que puedan estar buscando lo mismo. Consulte [¿Cómo escribo una buena respuesta?] (Https://stackoverflow.com/help/how-to-answer) – rmjoia

+0

Explique qué hace el código en su respuesta para que las personas con poco conocimiento de las tecnologías involucradas tener la oportunidad de comprenderlo y reutilizarlo. – Wndrr

Cuestiones relacionadas