Para la velocidad, me gustaría límite de una consulta de 10 resultados

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

Sin embargo, también me gustaría saber el recuento total, por tanto, decir que «hubo 124, pero solo tengo 10». Hay una buena manera eficiente de hacer esto?

InformationsquelleAutor Geoff | 2013-03-08

5 Comentarios

  1. 37

    Por defecto, count() ignora limit() y cuenta los resultados de la consulta completa.
    Así, si por ejemplo hacer esto, var a = db.collection.find(...).limit(10);
    ejecución de a.count() le dará el recuento total de la consulta.

    • hola, ¿cómo puedo asegurarme de que el limitador se ha aplicado sin usar count()? ¿Hay alguna otra manera?
    • Alguna idea de cómo hacer esto en MongoDB nodejs conductor sin consultar dos veces?
  2. 25

    Haciendo recuento(1) incluye el límite y saltar.

    • Como de mongoengine, TypeError: with_limit_and_skip must be True or False, count(True) va a hacer el trabajo
  3. 5

    La aceptó responder por @johnnycrab es para el mongo de la CLI.

    Si tienes que escribir el mismo código en Node.js y Express.js usted tendrá que utilizar para poder utilizar la función «contar» junto con el método toArray del «resultado».

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

    A continuación, puede ejecutar dos funciones después de esta (anidado en el otro)

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

    Hay una solución mediante el empuje y la rebanada: https://stackoverflow.com/a/39784851/4752635

    Me prefe

    1. Primera para el filtrado y, a continuación, la agrupación de IDENTIFICACIÓN para obtener el número de elementos filtrados. No filtro de aquí, no es necesario.
    2. Segunda consulta que filtra, ordena y pagina.

    Solución con la que empuja $$ROOT y usando $rebanada de carreras en el documento de la limitación de memoria de 16MB para grandes colecciones. También, para grandes colecciones de dos consultas juntos parecen correr más rápido que el de uno con $$ROOT empujando. Se puede ejecutar en paralelo, de modo que sólo están limitadas por la más lenta de las dos consultas (probablemente el tipo).

    Que se han asentado con esta solución con 2 consultas y marco de agregación (nota: yo 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
    });
    }
    });
    }
    });
    });

Dejar respuesta

Please enter your comment!
Please enter your name here