Tutoriel MongoD...login
Tutoriel MongoDB
auteur:php.cn  temps de mise à jour:2022-04-21 17:49:03

Agrégation MongoDB


L'agrégation dans MongoDB est principalement utilisée pour traiter des données (telles que des moyennes statistiques, des sommes, etc.) et renvoyer les résultats des données calculées. Un peu similaire à count(*) dans l'instruction SQL.


Méthode Aggregate()

La méthode d'agrégation dans MongoDB utilise Aggregate().

Syntaxe

Le format de syntaxe de base de la méthode Aggregate() est le suivant :

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Instance

Les données de la collection sont les suivantes :

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'w3cschool.cc',
   url: 'http://www.w3cschool.cc',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'w3cschool.cc',
   url: 'http://www.w3cschool.cc',
   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
},

Maintenant, nous calculons le nombre d'articles écrits par chaque auteur à travers la collection ci-dessus, et utilisons Aggregate() pour calculer le résultat comme suit :

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "w3cschool.cc",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}
>

L'exemple ci-dessus est similaire au SQL instruction : select by_user, count(*) from mycol group by by_user

Dans l'exemple ci-dessus, nous regroupons les données par champ by_user et calculons la somme des mêmes valeurs du champ by_user.

Le tableau suivant présente quelques expressions agrégées :

表达式描述实例
$sum计算总和。db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg计算平均值db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min获取集合中所有文档对应值得最小值。db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max获取集合中所有文档对应值得最大值。db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push在结果文档中插入值到一个数组中。db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet在结果文档中插入值到一个数组中,但不创建副本。db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first根据资源文档的排序获取第一个文档数据。db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

Le concept de pipe

Pipeline est généralement utilisé sous Unix et Linux pour utiliser la sortie de la commande actuelle comme paramètre de la commande suivante.

Le pipeline d'agrégation de MongoDB transmet les résultats du document MongoDB au pipeline suivant pour traitement une fois qu'un pipeline est terminé. Les opérations du pipeline sont reproductibles.

Expression : traitez le document d'entrée et sortez-le. L'expression est sans état et ne peut être utilisée que pour calculer les documents du pipeline d'agrégation actuel et ne peut pas traiter d'autres documents.

Nous introduisons ici plusieurs opérations couramment utilisées dans le cadre d'agrégation :

  • $project : modifier la structure du document d'entrée. Il peut être utilisé pour renommer, ajouter ou supprimer des champs, et peut également être utilisé pour créer des résultats de calcul et des documents imbriqués.

  • $match : utilisé pour filtrer les données et afficher uniquement les documents qui remplissent les conditions. $match utilise les opérations de requête standard de MongoDB.

  • $limit : utilisé pour limiter le nombre de documents renvoyés par le pipeline d'agrégation MongoDB.

  • $skip : ignore le nombre spécifié de documents dans le pipeline d'agrégation et renvoie les documents restants.

  • $unwind : divisez un champ de type tableau dans le document en plusieurs champs, chacun contenant une valeur dans le tableau.

  • $group : regroupe les documents de la collection et peut être utilisé pour des résultats statistiques.

  • $sort : Triez les documents d'entrée et sortez-les.

  • $geoNear : produit des documents ordonnés à proximité d'un certain emplacement géographique.

Instance d'opérateur de pipeline

1. Instance de $project


db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );

Dans ce cas, il n'y aura que Il y a trois champs : _id, tilt et author. Par défaut, le champ _id est inclus. Si vous ne souhaitez pas inclure _id, vous pouvez faire ceci :

db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});

2.$match instance

db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 } } }
                       ] );
<. 🎜>$match est utilisé pour obtenir des enregistrements avec des scores supérieurs à 70 et inférieurs ou égaux à 90, puis envoie les enregistrements qui remplissent les conditions à l'opérateur de pipeline $group de l'étape suivante pour traitement.

3.$skip instance

db.article.aggregate(
    { $skip : 5 });

Après avoir été traités par l'opérateur du pipeline $skip, les cinq premiers documents sont "filtrés".