Introduction

Dans cet article je vais vous présenter le Mongodb group by multiple fields. Pour mieux comprendre d’abord nous allons apprendre la fonction d’agrégation.

Fonction d’agrégation de Mongodb

Les fonctions d’agrégation sont utilisées dans les clauses GROUP BY pour agréger des données groupées. Les fonctions d’agrégation sont plus performantes lorsqu’elles sont utilisées avec la clause GROUP BY. Cependant, l’utilisation de la fonction d’agrégation n’est pas limitée aux requêtes groupées.

Lorsqu’une fonction d’agrégation est utilisée dans une requête sans la clause GROUP BY, la fonction d’agrégation agrège l’ensemble des résultats (toutes les lignes qui correspondent à la clause WHERE). Si vous n’utilisez pas la clause GROUP BY, certaines fonctions d’agrégation de la liste SELECT ne peuvent être utilisées qu’avec d’autres fonctions d’agrégation. C’est pourquoi la fonction d’agrégation doit utiliser la clause GROUP BY pour se connecter à la liste dans la liste SELECT.

Par exemple, au lieu d’utiliser la clause GROUP BY, AVG dans une liste SELECT peut seulement correspondre à SUM, mais il ne peut pas correspondre à une colonne spécifique.

L’opération d’agrégation MongoDB est utilisée pour les opérations par lots sur les données. Après le regroupement de la collection par condition, une série d’opérations telles que la somme, la moyenne et d’autres sont effectuées. Les opérations d’agrégation peuvent effectuer des opérations de collections complexes, notamment pour les statistiques mathématiques et l’exploration de données.

L’entrée de l’opération d’agrégation dans MongoDB est le document de la collection. La sortie peut être un ou plusieurs documents. MongoDB offre une opération d’agrégation très puissante qui peut être divisée en trois catégories :

  • Pipeline d’agrégation
  • Opération d’agrégation à usage unique
  • MapReduce programming model

Mongodb Group by Multiple Fields

L’opérateur $ group est un agrégateur qui renvoie un nouveau document. Il possède son propre opérateur, nous pouvons obtenir le champ du document actuel par le symbole $ + le nom du champ. Pour comprendre d’abord le groupe MongoDB par plusieurs champs, regardons une liste de tous les opérateurs qui peuvent être utilisés dans $ group:

  • $ sum – Renvoie la somme de tous les champs numériques.
  • $ avg – Calcule la moyenne entre les champs numériques.
  • $ min – Renvoie la valeur minimale du champ numérique
  • $ max – Obtenir la valeur maximale du champ numérique.
  • $ push – Insère la valeur du champ dans le champ du résultat
  • $ addToSet – Insère une valeur dans un tableau du document résultant, mais ne crée pas de doublons.
  • $ first – Obtient seulement le premier document parmi ceux regroupés, généralement pour le tri.
  • $ last – Renvoie le dernier document.

Pipeline d’agrégation

En mode POSIX multithreadé, il existe une méthode appelée pipeline, dont le flux d’éléments de données est exécuté séquentiellement par un ensemble de threads dans l’ordre spécifié.Le pipeline d’agrégation est constitué d’une étape. Après avoir traité le document dans une étape, le pipeline d’agrégation transfère le résultat du traitement à l’étape suivante.

Fonction tube polymère Filtrer le document pour trouver les documents qui répondent aux critères. Convertir le document et modifier la forme de sortie du document.

Chaque niveau du pipeline d’agrégation est défini à l’aide d’opérateurs d’étape, et chaque opérateur d’étape peut utiliser des opérateurs d’expression pour calculer la somme, la moyenne, la concaténation ou les sauts de ligne avant chaque niveau. Le résultat est renvoyé à la fin et le résultat renvoyé peut être directement sorti ou enregistré dans la collection.

Flux de traitement

  • Db.collection.aggregate () peut utiliser plusieurs canaux en même temps pour le traitement des données.
  • Db.collection.aggregate () utilise les opérations natives de MongoDB pour agréger efficacement et supporter des opérations telles que GroupBy en SQL sans avoir à écrire des routines JS personnalisées.
  • Chaque phase du pipeline limite 100 Mo de mémoire. Si un pipeline à un seul nœud dépasse cette limite, MongoDB génère une erreur. Pour traiter de grandes quantités de données, définissez la propriété allowDiskUse sur true pour écrire les données dans un fichier temporaire pour un nœud de pipeline agrégé et autoriser une limite de mémoire de 100 Mo.
  • Db.collection.aggregate () peut être appliqué à une série de tranches, mais le résultat ne peut pas être perdu dans la série de tranches. MapReduce peut être appliqué à une série de tranches, et le résultat peut être perdu dans une série de tranches.
  • Db.collection.aggregate () renvoie un curseur, les données sont stockées en mémoire et peuvent être gérées directement comme MongoShell.
  • La sortie de db.collection.aggregate () ne peut être enregistrée que dans un seul document, et la taille du document BSON est limitée à 16 Mo.

Méthode de regroupement

L’utilisation de la méthode de regroupement est similaire à l’utilisation de la clause GROUP BY en SQL. La méthode de regroupement a trois paramètres :

  • Key : Affiche la clé du groupe
  • Initial : Initialise le champ du document qui représente le groupe de documents
  • Reduce : Une fonction qui renvoie le nombre d’éléments. Cette fonction utilise deux paramètres comme arguments : l’élément actuel et le document de résultat agrégé pour le groupe actuel.
  • Keyf : paramètre facultatif. Utilisez une fonction autre que l’argument clé pour représenter l’objet clé de retour.
  • Cond : paramètre facultatif. Spécifie que la condition doit retourner true, sinon le document ne participera pas au regroupement. Si ce paramètre n’est pas spécifié, tous les documents participent au regroupement.
  • Finalize : paramètre facultatif. Il représente une fonction qui est déclenchée avant de retourner un résultat groupé.

Par exemple:`js> db.users.group ({key : {name : true}, initial : {total : 0},reduce : function (curr, res){res.total += 1}})`

Regardons l’expression. Le paramètre key spécifie que le groupe sera regroupé par nom : key : {name : true}

La valeur du paramètre initial initialise les champs qui représentent le document résultat pour le groupe. Dans ce cas, la valeur initiale du champ total est définie. Ce champ indique le nombre d’éléments dans le groupe. Comme il peut ne pas y avoir d’éléments, on initialise à zéro.

Le paramètre reduce représente une fonction où le paramètre curr pointe vers l’objet actuel du groupe et res représente le groupe actuel. Si vous trouvez un autre objet avec une valeur spécifique pour le champ nom, ajoutez ce document au groupe et augmentez la valeur totale dans le document res de 1.

L’utilisation de $group

Le $group utilise _id pour spécifier le nom de la clé à regrouper, en utilisant les statistiques du champ personnalisé. L’utilisation de l’opération d’agrégation effacera le concept de groupe Mongodb par plusieurs champs.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
db.users.aggregate({
$match : { age : { $gte : 18 } } }
},{
$group : { _id:$username, count:{$sum:1} }
});
// Mongodb group by multiple fields
db.users.aggregate({
$match : {age : {$gte:18} }},
$group : {_id:{username:$username, age:$ge}, ‘count’:{$sum:1} }
})
// $sum:val Ajouter val à chaque document
// $avg:val Faire la moyenne de la valeur de chaque document
db.users.aggregate({
$group : { _id:$username, count:{$avg:$age} }
})
db.users.aggregate({
$group : { _id:$username, count:{$max:$age} }
})
db.users.aggregate({
$group : {_id:$username, count:{$min:$age} }
})
// $first:val Devenir premier du groupe
db.users.aggregate({
$group:{_id:$username, count:{$first : $age} }
})
db.users.aggregate({
$group:{_id:$username, count:{$last : $age} }
})
db.users.aggregate({
$group : {_id:$username, count:{$addToSet : $age} }
})
db.users.aggregate({
$group:{_id:$username, count:{$push : $age} }
})

Mongodb group par plusieurs champs en utilisant l’opération Aggregate

D’abord, la clé sur laquelle le groupement est basé est sélectionnée et ensuite la collection est divisée en groupes selon la valeur de la clé sélectionnée. Vous pouvez ensuite créer un document final en agrégeant les documents de chaque groupe.

Le groupe ne prend pas en charge les clusters fragmentés et ne peut pas effectuer de clustering shard. Si vous avez besoin d’un support distribué, vous devez utiliser aggregate ou mapReduce.

1
2
3
4
5
6
7
8
9
10
11
12
13
db.collection.group(document)
{
# Champ de regroupement
key:{key1, key2:1},
# Conditions de requête
cond:{},
# Fonction d’agrégation
reduce:function(current, result){},
# initialisation
initial:{},
# Ensemble de fonctions de retour de comptage
finalize:function(){}
}.

Calculer le nombre d’éléments dans chaque colonne

.

1
2
3
4
5
6
7
8
9
SELECT COUNT(*) FROM goods GROUP BY category_id ;
db.goods.group({
key:{category_id:1},
cond:{},// tous ensemble
reduce:function(current, result){// Correspondant à la ligne actuelle,result Correspondant à plusieurs lignes du groupe
result.total += 1;
},
initial:{total:0}
}).

Conclusion

Cet article est écrit pour les développeurs afin de comprendre le groupe Mongodb par plusieurs champs en utilisant la fonction agrégat. Si vous trouvez cet article utile continuez à visiter Object Rocket pour plus d’articles liés aux bases de données.

Si vous avez besoin de conseils ou d’aide pour gérer la sécurité de votre base de données, l’évolutivité ou les sauvegardes, n’hésitez pas à nous contacter chez Object Rocket.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.