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()
etprintjson()
pour inclure la sortie de diagnostic dans lemongod
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