/ / MongoDB {aggregation $ match} vs {find} speed - mongodb, aggregation-framework

MongoDB {aggregation $ match} vs {find} speed - mongodb, aggregation-framework

J'ai une collection mongoDB avec des millions de ligneset j'essaie d'optimiser mes requêtes. J'utilise actuellement la structure d'agrégation pour extraire des données et les regrouper à ma guise. Ma requête d'agrégation typique ressemble à quelque chose comme: $match > $group > $ group > $project

Cependant, j'ai remarqué que les dernières parties ne prennent que quelques ms, le début est le plus lent.

J'ai essayé d'effectuer une requête avec uniquement le filtre $ match, puis d'effectuer la même requête avec collection.find. La requête d'agrégation prend environ 80 ms alors que la requête de recherche prend 0 ou 1 ms.

J’ai des index sur à peu près tous les domaines, alors j’imagine que ce n’est pas le problème. Avez-vous une idée de ce qui pourrait mal tourner? Ou s’agit-il d’un inconvénient "normal" du cadre d’agrégation?

Je pourrais utiliser des requêtes de recherche plutôt que des requêtes d'agrégation. Cependant, je devrais effectuer beaucoup de traitement après la demande et ce processus peut être fait rapidement $group etc. donc je préférerais conserver le cadre d'agrégation.

Merci,

MODIFIER :

Voici mes critères:

{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}

Réponses:

15 pour la réponse № 1

Le but principal de la aggregation framework est de faciliter la recherche d’un grand nombre d’entrées et de générer un faible nombre de résultats qui ont de la valeur

Comme vous l'avez dit, vous pouvez également utiliser plusieurs find requêtes, mais rappelez-vous que vous ne pouvez pas créer de nouveaux champs avec find requêtes. D'autre part, le $group stage vous permet de définir vos nouveaux champs.

Si vous souhaitez réaliser les fonctionnalités du aggregation framework, vous devrez probablement exécuter une première find (ou en chaîner plusieurs), extrayez ces informations et manipulez-les avec un langage de programmation.

le aggregation pipeline Cela peut sembler prendre plus de temps, mais au moins vous savez que vous n’avez qu’à tenir compte des performances d’un système - le moteur MongoDB.

Considérant que, s’agissant de la manipulation des données renvoyées par un find requête, vous devrez probablement manipuler davantage les données avec un langage de programmation, augmentant ainsi la complexité en fonction de la complexité du langage de programmation choisi.


3 pour la réponse № 2

Avez-vous essayé d'utiliser expliquez () à votre recherchedes questions? Cela vous donnera une bonne idée du temps que prendra exactement la requête find (). Vous pouvez faire la même chose pour $ match avec $ expliquer et voir s’il existe une différence entre l’accès à l’index et les autres paramètres.

Aussi la partie $ group du framework d'agrégationn’utilise pas l’indexation, il doit donc traiter tous les enregistrements renvoyés par l’étape $ match du framework d’agrégation. Donc, pour mieux comprendre le fonctionnement de votre requête, voyez le jeu de résultats qu’elle renvoie et si elle est stockée en mémoire pour être traitée par MongoDB .