113 votes

Requête Mongoose de limite/excentration et de comptage

Une question un peu étrange sur les performances des requêtes... J'ai besoin d'exécuter une requête qui fait un comptage total des documents, et qui peut également retourner un ensemble de résultats qui peut être limité et décalé.

Ainsi, j'ai 57 documents au total, et l'utilisateur veut 10 documents décalés de 20.

Je vois deux façons de procéder : la première consiste à demander l'ensemble des 57 documents (renvoyés sous forme de tableau), puis à utiliser array.slice pour renvoyer les documents souhaités. La deuxième option consiste à lancer deux requêtes, la première utilisant la méthode native "count" de Mongo, puis une deuxième requête utilisant les agrégateurs natifs $limit et $skip de Mongo.

Lequel, selon vous, serait le plus adapté ? Tout faire en une seule requête, ou en exécuter deux séparément ?

Edita:

// 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});
    });
});

3voto

Vous n'avez pas besoin d'utiliser deux requêtes ou une requête compliquée avec des agrégats et autres.

Vous pouvez utiliser une requête

exemple :

const getNames = async (queryParams) => {

  const cursor = db.collection.find(queryParams).skip(20).limit(10);
  return {
    count: await cursor.count(),
    data: await cursor.toArray()
  }

}

mongo renvoie un curseur qui possède des fonctions prédéfinies telles que count, qui renvoie le nombre total de résultats demandés, sans tenir compte du saut et de la limite.

Ainsi, dans la propriété count, vous obtiendrez la longueur totale de la collection et dans la propriété data, vous obtiendrez juste le chunk avec un offset de 20 et une limite de 10 documents.

2voto

Baryon Lee Points 329

Merci Igor Igeto Mitkovski, la meilleure solution est d'utiliser la connexion native.

est ici : https://docs.mongodb.com/manual/reference/method/cursor.count/#mongodb-method-cursor.count et la mangouste ne le supporte pas ( https://github.com/Automattic/mongoose/issues/3283 )

nous devons utiliser la connexion native.

const query = StudentModel.collection.find(
    {
       age: 13
    }, 
    {
       projection:{ _id:0 }
    }
    ).sort({ time: -1 })
const count = await query.count()
const records = await query.skip(20)
          .limit(10).toArray()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X