MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comparaison d'agrégation MongoDB :group(), $group et MapReduce

C'est quelque peu déroutant car les noms sont similaires, mais le group() La commande est une fonctionnalité et une implémentation différentes du $group opérateur de pipeline dans le cadre d'agrégation.

La commande group(), Aggregation Framework et MapReduce sont collectivement des fonctionnalités d'agrégation de MongoDB. Il y a un certain chevauchement dans les fonctionnalités, mais je vais essayer d'expliquer les différences et les limites de chacune comme dans MongoDB 2.2.0.

Remarque :ensembles de résultats intégrés mentionnés ci-dessous font référence aux requêtes qui sont traitées en mémoire avec des résultats renvoyés à la fin de l'appel de fonction. Les options de sortie alternatives (actuellement uniquement disponibles avec MapReduce) peuvent inclure l'enregistrement des résultats dans une collection nouvelle ou existante.

group() Commande

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

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

  • Implémenté à l'aide du moteur JavaScript ; reduce() personnalisé les fonctions peuvent être écrites en JavaScript.

  • Limites actuelles

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

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

    • Prend un verrou en lecture et n'autorise aucun autre thread à exécuter JavaScript pendant son exécution.

    • Ne fonctionne pas avec les collections partitionnées.

  • Voir aussi :exemples de commande group() .

MapReduce

  • Implémente le modèle MapReduce pour le traitement de grands ensembles de données.

  • Peut choisir parmi plusieurs options de sortie (en ligne, nouvelle collection, fusionner, remplacer, réduire)

  • Les fonctions MapReduce sont écrites en JavaScript.

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

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

  • MongoDB 2.2 implémente une bien meilleure prise en charge de la sortie de réduction de carte fragmentée.

  • Limites actuelles

    • Une seule émission ne peut contenir que la moitié de la taille maximale du document BSON de MongoDB (16 Mo).

    • Il existe un verrou JavaScript afin qu'un serveur mongod ne puisse 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 générés fréquemment.

    • Les fonctions MapReduce peuvent être difficiles à déboguer. Vous pouvez utiliser print() et printjson() pour inclure la sortie de diagnostic dans le mongod journal.

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

  • Voir aussi :Exemples de mappage/réduction .

Cadre d'agrégation

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

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

  • Renvoie le jeu de résultats en ligne.

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

  • Utilise une approche "pipeline" dans laquelle 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 n'ont pas besoin de produire un document de sortie pour chaque document d'entrée :les opérateurs peuvent également générer de nouveaux documents ou filtrer des documents.

  • À l'aide de projections, vous pouvez ajouter des champs calculés, créer de nouveaux sous-objets virtuels et extraire des sous-champs dans le niveau supérieur des résultats.

  • Les opérateurs de pipeline peuvent être répétés si nécessaire (par exemple, plusieurs $project ou $group étapes.

  • Limites actuelles

    • Les résultats sont renvoyés en ligne, ils sont donc limités à la taille de document maximale prise en charge par le serveur (16 Mo)

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

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

    • Fonctionnalité de serveur la plus récente pour l'agrégation, a donc plus de place pour mûrir en termes de documentation, d'ensemble de fonctionnalités et d'utilisation.

  • Voir aussi :Exemples de cadre d'agrégation .

Quelqu'un peut-il présenter une illustration ou me guider vers un lien où ces trois concepts sont expliqués ensemble, en prenant les mêmes exemples 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 les questions StackOverflow précédentes qui montrent des variations :

  • group() contre cadre d'agrégation
  • MapReduce contre Aggregation Framework