MongoDB - Agrégation

Les opérations d'agrégation traitent les enregistrements de données et renvoient les résultats calculés. Les opérations d'agrégation regroupent les valeurs de plusieurs documents et peuvent effectuer diverses opérations sur les données regroupées pour renvoyer un seul résultat. Dans SQL count (*) et avec group by est un équivalent de l'agrégation MongoDB.

La méthode aggregate ()

Pour l'agrégation dans MongoDB, vous devez utiliser aggregate() méthode.

Syntaxe

Syntaxe de base de aggregate() la méthode est la suivante -

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Exemple

Dans la collection, vous avez les données suivantes -

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

À partir de la collection ci-dessus, si vous souhaitez afficher une liste indiquant le nombre de didacticiels écrits par chaque utilisateur, vous utiliserez ce qui suit aggregate() méthode -

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>

La requête équivalente SQL pour le cas d'utilisation ci-dessus sera select by_user, count(*) from mycol group by by_user.

Dans l'exemple ci-dessus, nous avons regroupé les documents par champ by_useret à chaque occurrence de la valeur précédente de la somme par l'utilisateur est incrémentée. Voici une liste des expressions d'agrégation disponibles.

Expression La description Exemple
somme $ Résume la valeur définie de tous les documents de la collection. db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ sum: "$ likes"}}}])
$ moyenne Calcule la moyenne de toutes les valeurs données de tous les documents de la collection. db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ avg: "$ likes"}}}])
$ min Obtient le minimum des valeurs correspondantes de tous les documents de la collection. db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ min: "$ likes"}}}])
$ max Obtient le maximum des valeurs correspondantes de tous les documents de la collection. db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ max: "$ likes"}}}])
$ pousser Insère la valeur dans un tableau dans le document résultant. db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ push: "$ url"}}}])
$ addToSet Insère la valeur dans un tableau dans le document résultant mais ne crée pas de doublons. db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ addToSet: "$ url"}}}])
$ premier Obtient le premier document des documents source en fonction du regroupement. En général, cela n'a de sens qu'avec une étape «$ sort» précédemment appliquée. db.mycol.aggregate ([{$ group: {_id: "$ by_user", first_url: {$ first: "$ url"}}}])
$ dernier Obtient le dernier document des documents source en fonction du regroupement. En général, cela n'a de sens qu'avec une étape «$ sort» précédemment appliquée. db.mycol.aggregate ([{$ group: {_id: "$ by_user", last_url: {$ last: "$ url"}}}])

Concept de pipeline

Dans la commande UNIX, le pipeline shell signifie la possibilité d'exécuter une opération sur une entrée et d'utiliser la sortie comme entrée pour la commande suivante et ainsi de suite. MongoDB prend également en charge le même concept dans le cadre d'agrégation. Il existe un ensemble d'étapes possibles et chacune d'elles est considérée comme un ensemble de documents en tant qu'entrée et produit un ensemble de documents résultant (ou le document JSON final résultant à la fin du pipeline). Cela peut ensuite être utilisé à son tour pour l'étape suivante et ainsi de suite.

Voici les étapes possibles du cadre d'agrégation -

  • $project - Utilisé pour sélectionner certains champs spécifiques d'une collection.

  • $match - Il s'agit d'une opération de filtrage et donc cela peut réduire la quantité de documents qui sont donnés en entrée à l'étape suivante.

  • $group - Cela fait l'agrégation réelle comme indiqué ci-dessus.

  • $sort - Trie les documents.

  • $skip - Avec cela, il est possible d'avancer dans la liste des documents pour un nombre donné de documents.

  • $limit - Cela limite la quantité de documents à consulter, par le nombre donné à partir des positions actuelles.

  • $unwind- Ceci est utilisé pour dérouler les documents qui utilisent des tableaux. Lors de l'utilisation d'un tableau, les données sont en quelque sorte pré-jointes et cette opération sera annulée avec cela pour avoir à nouveau des documents individuels. Ainsi, avec cette étape, nous augmenterons la quantité de documents pour la prochaine étape.