English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Aggrégation MongoDB

Les opérations d'agrégation traitent les enregistrements de données et retournent les résultats de calcul. Les opérations d'agrégation regroupent les valeurs provenant de plusieurs documents et peuvent exécuter diverses opérations sur les données regroupées pour retourner un seul résultat. Dans SQL, count(*)et group by sont équivalents aux opérations d'agrégation de MongoDB.

la méthode Aggregate()

Pour les opérations d'agrégation de MongoDB, vous devriez utiliser aggregate() Méthode.

Syntaxe

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

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Exemple en ligne

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

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB不是SQL数据库',
   by_user: 'oldtoolbag.com,
   url: 'https://fr.oldtoolbag.com,
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No SQL数据库是非常快的',
   by_user: 'oldtoolbag.com,
   url: 'https://fr.oldtoolbag.com,
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview' 
   description: 'Neo4j est une base de données NoSQL
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

Maintenant, si vous souhaitez afficher une liste indiquant combien de tutoriels chaque utilisateur a écrit à partir de la collection ci-dessus, vous utiliserez ce qui suitaggregate()Méthode-

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

La requête SQL équivalente à l'exemple ci-dessus sera select by_user, count(*) from mycol group by by_user.

Dans l'exemple ci-dessus, nous avons déjà regroupé par le champby_userLes documents ont été regroupés et la valeur de sum précédente augmente à chaque regroupement par utilisateur. Voici la liste des expressions d'aggrégation disponibles.

ExpressionDescriptionExemple
$sumCalculer la somme.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avgCalculer la moyenne.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$minObtenir la valeur minimale correspondant à chaque document dans la collection.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$maxObtenir la valeur maximale correspondant à chaque document dans la collection.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$pushInsérer une valeur dans un tableau dans le document de résultat.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"}}}])

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

这里我们介绍一下聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。

  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

  • $limit:用来限制MongoDB聚合管道返回的文档数。

  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。

  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

  • $group:将集合中的文档分组,可用于统计结果。

  • $sort:将输入文档排序后输出。

  • $geoNear:输出接近某一地理位置的有序文档。

d'opérations en pipeline

1d'exemple

db.article.aggregate(
    { $project : { }}
        titre : 1 ,
        auteur : 1 ,
    }}
 );

De cette manière, le résultat ne contiendra que les trois champs _id, title et author, par défaut, le champ _id est inclus. Si vous ne souhaitez pas inclure _id, vous pouvez le faire ainsi :

db.article.aggregate(
    { $project : { }}
        _id : 0 ,
        titre : 1 ,
        auteur : 1
    ]]);

2.$match instance

db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 };
                       ]);

$match est utilisé pour obtenir les scores supérieurs à70 est inférieur ou égal à90 enregistrements, puis les enregistrements qualifiés sont envoyés à la phase suivante $group de l'opérateur pipe.

3.$skip instance

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

Après l'opération de pipe $skip, les cinq premiers documents ont été "filtrés".