39 votes

Comparaison des agrégations MongoDB : group(), $group et MapReduce

Je ne sais pas quand utiliser group(), aggregate avec $group ou mapreduce. J'ai lu la documentation à http://www.mongodb.org/display/DOCS/Aggregation pour group(), http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group pour $group. Est-ce que le sharding est la seule situation où group() ne fonctionne pas ? De plus, j'ai l'impression que $group est plus puissant que group() parce qu'il peut être utilisé en conjonction avec d'autres opérateurs de pipeline à partir du cadre d'agrégation Comment $group se compare-t-il à mapreduce ? J'ai lu quelque part qu'il ne génère pas de collection temporaire alors que mapreduce le fait. Est-ce le cas ?
Quelqu'un peut-il me présenter une illustration ou me guider vers un lien où ces trois concepts sont expliqués ensemble, en prenant le même échantillon de données, afin que je puisse les comparer facilement ?

EDITAR:
De plus, il serait bon que vous puissiez nous signaler toute nouveauté spécifique à ces commandes depuis la sortie de la nouvelle version 2.2.

74voto

Stennie Points 19196

Il y a une certaine confusion, car les noms sont similaires, mais les group() commande est une fonctionnalité et une implémentation différentes de celles du $group opérateur de pipeline dans le cadre de l'agrégation.

La commande group(), le cadre d'agrégation et MapReduce sont collectivement appelés caractéristiques de l'agrégation de MongoDB. Certaines fonctionnalités se chevauchent, mais je vais tenter d'expliquer les différences et les limites de chacune d'entre elles à partir de la version 2.2.0 de MongoDB.

Nota: ensembles de résultats en ligne mentionnées ci-dessous se réfèrent à des requêtes qui sont traitées en mémoire et dont les résultats sont renvoyés à la fin de l'appel de la fonction. D'autres options de sortie (actuellement disponibles uniquement avec MapReduce) pourraient inclure l'enregistrement des résultats dans une collection nouvelle ou existante.

group() Commandement

  • Syntaxe et fonctionnalité simples pour le regroupement analogue à GROUP BY en SQL.

  • Renvoie l'ensemble des résultats en ligne (sous la forme d'un tableau d'éléments groupés).

  • Mis en œuvre à l'aide du moteur JavaScript ; personnalisé reduce() peuvent être écrites en JavaScript.

  • Limites actuelles

    • Ne sera pas regroupé dans un ensemble de résultats comportant plus de 20 000 clés.

    • Les résultats doivent s'inscrire dans les limites d'un document BSON (actuellement 16 Mo).

    • Prend un verrou en lecture et ne permet pas à d'autres threads d'exécuter JavaScript pendant qu'il est en cours d'exécution.

    • Ne fonctionne pas avec les collections partagées.

  • Voir aussi exemples de commandes group() .

MapReduce

  • Met en œuvre la fonction Modèle MapReduce pour le traitement de grands ensembles de données.

  • Vous pouvez choisir parmi plusieurs options de sortie (en ligne, nouvelle collection, fusion, remplacement, réduction)

  • Les fonctions MapReduce sont écrites en JavaScript.

  • Prend en charge les collections d'entrée non partagées et partagées.

  • Peut être utilisé pour l'agrégation incrémentale de grandes collections.

  • MongoDB 2.2 offre une meilleure prise en charge de la fonction sortie de la carte de réduction en nuage (sharded map reduce) .

  • Limites actuelles

    • Un seul emit ne peut contenir que la moitié de la taille maximale d'un document BSON de MongoDB (16 Mo).

    • Il existe un verrou JavaScript, de sorte qu'un serveur mongod ne peut exécuter qu'une seule fonction JavaScript à la fois cependant, la plupart des étapes de MapReduce sont très courtes, de sorte que les verrous peuvent être cédés fréquemment.

    • Les fonctions MapReduce peuvent être difficiles à déboguer. Vous pouvez utiliser print() y printjson() pour inclure les résultats du diagnostic dans le mongod logarithme.

    • MapReduce n'est généralement pas intuitif pour les programmeurs qui tentent de traduire l'expérience de l'agrégation de requêtes relationnelles.

  • Voir aussi Exemples Map/Reduce .

Cadre d'agrégation

  • Nouvelle fonctionnalité dans la version de production MongoDB 2.2.0 (août 2012).

  • Conçu avec des objectifs spécifiques d'amélioration des performances et de la facilité d'utilisation.

  • Renvoie l'ensemble des résultats en ligne.

  • Prend en charge les collections d'entrée non partagées et partagées.

  • Utilise une approche "pipeline" où les objets sont transformés lorsqu'ils passent par une série d'opérateurs de pipeline tels que la correspondance, la projection, le tri et le regroupement.

  • Les opérateurs de pipeline ne doivent pas nécessairement produire un document de sortie pour chaque document d'entrée : ils peuvent également générer de nouveaux documents ou filtrer des documents.

  • Les projections permettent d'ajouter des champs calculés, de créer de nouveaux sous-objets virtuels et d'extraire des sous-champs au niveau supérieur des résultats.

  • Les opérateurs de pipeline peuvent être répétés selon les besoins (par exemple, plusieurs $project o $group étapes.

  • Limites actuelles

    • Les résultats sont renvoyés en ligne et sont donc limités à la taille maximale du document supportée par le serveur (16 Mo).

    • Ne prend pas en charge autant d'options de sortie que MapReduce

    • Limité à opérateurs et expressions pris en charge par le cadre d'agrégation (c'est-à-dire qu'il n'est pas possible d'écrire des fonctions personnalisées)

    • Fonctionnalité la plus récente du serveur pour l'agrégation, il dispose donc d'une plus grande marge de manœuvre pour mûrir en termes de documentation, de fonctionnalités et d'utilisation.

  • Voir aussi Exemples de cadres d'agrégation .

Quelqu'un peut-il me présenter une illustration ou me guider vers un lien où ces trois concepts sont expliqués ensemble, en prenant le même échantillon de données, afin que je puisse les comparer facilement ?

Vous ne trouverez généralement pas d'exemples où il serait utile de comparer les trois approches, mais voici des questions antérieures de StackOverflow qui montrent des variations :

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