ventajas que español desventajas caracteristicas mongodb

que - mongodb español



¿Limitar los resultados en MongoDB pero aún obtener el conteo completo? (5)

Hacer conteo (1) incluye límite y omisión.

Por velocidad, me gustaría limitar una consulta a 10 resultados

db.collection.find( ... ).limit(10)

Sin embargo, también me gustaría saber el recuento total, para decir "había 124 pero solo tengo 10". ¿Hay una buena manera eficiente de hacer esto?


Hay una solución usando push y slice: https://.com/a/39784851/4752635

Prefiero

  1. Primero para filtrar y luego agrupar por ID para obtener el número de elementos filtrados. No filtrar aquí, es innecesario.
  2. Segunda consulta que filtra, ordena y pagina.

La solución al presionar $$ ROOT y usar $ slice se ejecuta en la limitación de memoria de documentos de 16 MB para colecciones grandes. Además, para grandes colecciones, dos consultas juntas parecen ejecutarse más rápido que el que tiene $$ ROOT empujando. También puedes ejecutarlos en paralelo, por lo que estás limitado solo por la más lenta de las dos consultas (probablemente la que ordena).

Me he conformado con esta solución usando 2 consultas y un marco de agregación (nota: uso node.js en este ejemplo, pero la idea es la misma):

var aggregation = [ { // If you can match fields at the begining, match as many as early as possible. $match: {...} }, { // Projection. $project: {...} }, { // Some things you can match only after projection or grouping, so do it now. $match: {...} } ]; // Copy filtering elements from the pipeline - this is the same for both counting number of fileter elements and for pagination queries. var aggregationPaginated = aggregation.slice(0); // Count filtered elements. aggregation.push( { $group: { _id: null, count: { $sum: 1 } } } ); // Sort in pagination query. aggregationPaginated.push( { $sort: sorting } ); // Paginate. aggregationPaginated.push( { $limit: skip + length }, { $skip: skip } ); // I use mongoose. // Get total count. model.count(function(errCount, totalCount) { // Count filtered. model.aggregate(aggregation) .allowDiskUse(true) .exec( function(errFind, documents) { if (errFind) { // Errors. res.status(503); return res.json({ ''success'': false, ''response'': ''err_counting'' }); } else { // Number of filtered elements. var numFiltered = documents[0].count; // Filter, sort and pagiante. model.request.aggregate(aggregationPaginated) .allowDiskUse(true) .exec( function(errFindP, documentsP) { if (errFindP) { // Errors. res.status(503); return res.json({ ''success'': false, ''response'': ''err_pagination'' }); } else { return res.json({ ''success'': true, ''recordsTotal'': totalCount, ''recordsFiltered'': numFiltered, ''response'': documentsP }); } }); } }); });


La respuesta aceptada por @johnnycrab es para mongo CLI.

Si tiene que escribir el mismo código en Node.js y Express.js, tendrá que usarlo así para poder usar la función "contar" junto con el "resultado" de toArray.

var curFind = db.collection(''tasks'').find({query});

Entonces puede ejecutar dos funciones después de esto así (una anidada en la otra)

curFind.count(function (e, count) { // Use count here curFind.skip(0).limit(10).toArray(function(err, result) { // Use result here and count here }); });


Por defecto, count() ignora el limit() y cuenta los resultados en toda la consulta. Entonces cuando, por ejemplo, haces esto, var a = db.collection.find(...).limit(10); ejecutar a.count() le dará el recuento total de su consulta.