mongodb mongoose

mongodb - Mongoose limit/offset and count query



mongoose pagination (2)

Después de tener que abordar este tema yo mismo, me gustaría basarme en la respuesta del usuario854301.

Mangosta ^ 4.13.8 Pude usar una función llamada toConstructor() que me permitió evitar crear la consulta varias veces cuando se aplican los filtros. Sé que esta función también está disponible en versiones anteriores, pero deberá verificar los documentos de Mongoose para confirmar esto.

Los siguientes usos promete Bluebird:

let schema = Query.find({ name: ''bloggs'', age: { $gt: 30 } }); // save the query as a ''template'' let query = schema.toConstructor(); return Promise.join( schema.count().exec(), query().limit(limit).skip(skip).exec(), function (total, data) { return { data: data, total: total } } );

Ahora la consulta de recuento devolverá el total de registros coincidentes y los datos devueltos serán un subconjunto del total de registros.

Tenga en cuenta el () alrededor de la consulta () que construye la consulta.

Un poco extraño en el rendimiento de la consulta ... Necesito ejecutar una consulta que haga un recuento total de documentos, y también puede devolver un conjunto de resultados que puede ser limitado y compensado.

Entonces, tengo 57 documentos en total y el usuario quiere que 10 documentos se compensen por 20.

Puedo pensar en 2 formas de hacerlo, primero se consultan los 57 documentos (devueltos como una matriz) y luego usando array.slice se devuelven los documentos que desean. La segunda opción es ejecutar 2 consultas, la primera usando el método de recuento nativo de mongo, luego ejecutar una segunda consulta usando los agregadores $ limit y $ skip nativos de mongo.

¿Cuál crees que escalaría mejor? ¿Hacerlo todo en una consulta, o ejecutar dos por separado?

Editar:

// 1 query var limit = 10; var offset = 20; Animals.find({}, function (err, animals) { if (err) { return next(err); } res.send({count: animals.length, animals: animals.slice(offset, limit + offset)}); }); // 2 queries Animals.find({}, {limit:10, skip:20} function (err, animals) { if (err) { return next(err); } Animals.count({}, function (err, count) { if (err) { return next(err); } res.send({count: count, animals: animals}); }); });


Te sugiero que uses 2 consultas:

  1. db.collection.count() devolverá el número total de elementos. Este valor se almacena en algún lugar de Mongo y no se calcula.

  2. db.collection.find().skip(20).limit(10) aquí Supongo que podría usar un orden por algún campo, así que no olvide agregar un índice en este campo. Esta consulta también será rápida.

Creo que no debe consultar todos los elementos y no realizar omitir y tomar, porque más adelante, cuando tenga grandes cantidades de datos, tendrá problemas con la transferencia de datos y el procesamiento.