文章目录

  • 前言
  • 一、aggregate() 方法
  • 二、其他聚合的表达式 实例
  • 1.计算分组求和:$sum
  • 2、 计算平均值:$avg
  • 3、获取集合中所有文档对应值得最小值。$min
  • 4、获取集合中所有文档对应值得最大值。$max
  • 5、在结果文档中插入值到一个数组中。$push
  • 6、在结果文档中插入值到一个数组中,但不创建副本。$addToSet
  • 7、根据资源文档的排序获取第一个文档数据。$first
  • 8、根据资源文档的排序获取最后一个文档数据$last
  • 三、管道
  • 四、管道操作符实例
  • 1、$project实例
  • 2.$match实例
  • 3.$skip实例
  • 4、$limit
  • 5、$sort



前言

概念
聚合查询
就是把数据聚起来,经行统计。



一、aggregate() 方法

MongoDB中聚合的方法使用aggregate()。MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)。

语法
aggregate() 方法的基本语法格式如下所示:

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

实例
集合中的数据如下:

>db.stu.insert({
    name: '小明', 
    age: 13,
    score: 200
})

>db.stu.insert({
    name: '小红', 
    age: 10,
    score: 100
})

>db.stu.insert({
    name: '小李', 
    age: 11,
    score: 150
})
>db.stu.insert({
    name: '小黄', 
    age: 14,
    score: 150
})
>db.stu.insert({
    name: '小明', 
    age: 14,
    score: 110
})

查看结果:

aggregate match mongodb 包含 mongodb的aggregate_数据库

按成绩来分组统计成绩相同的数量(统计数量

db.stu.aggregate([{$group : {_id : "$score", num_score : {$sum : 1}}}])

aggregate match mongodb 包含 mongodb的aggregate_数据_02


以上实例类似sql语句:

select score, count(*) from stu group by score

二、其他聚合的表达式 实例

1.计算分组求和:$sum

db.stu.aggregate([{$group : {_id : "$name", num_score : {$sum : "$score"}}}])

aggregate match mongodb 包含 mongodb的aggregate_mongodb_03


类似:

select name, sum(score) from stu group by name

2、 计算平均值:$avg

db.stu.aggregate([{$group : {_id : "$name", num_score : {$avg : "$score"}}}])

3、获取集合中所有文档对应值得最小值。$min

db.stu.aggregate([{$group : {_id : "$name", num_score : {$min: "$score"}}}])

aggregate match mongodb 包含 mongodb的aggregate_数据库_04

4、获取集合中所有文档对应值得最大值。$max

db.stu.aggregate([{$group : {_id : "$name", num_score : {$max: "$score"}}}])

aggregate match mongodb 包含 mongodb的aggregate_mongodb_05

5、在结果文档中插入值到一个数组中。$push

db.stu.aggregate([{$group : {_id : "$name", num_score : {$push: "$age"}}}])

aggregate match mongodb 包含 mongodb的aggregate_数组_06

6、在结果文档中插入值到一个数组中,但不创建副本。$addToSet

db.stu.aggregate([{$group : {_id : "$name", num_score : {$addToSet: "$age"}}}])

aggregate match mongodb 包含 mongodb的aggregate_数组_07

7、根据资源文档的排序获取第一个文档数据。$first

db.stu.aggregate([{$group : {_id : "$name", first : {$first: "$age"}}}])

aggregate match mongodb 包含 mongodb的aggregate_数据库_08

8、根据资源文档的排序获取最后一个文档数据$last

db.stu.aggregate([{$group : {_id : "$name", first : {$last: "$age"}}}])

aggregate match mongodb 包含 mongodb的aggregate_数组_09

三、管道

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

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

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

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

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • **aggregate match mongodb 包含 mongodb的aggregate_数据库_10match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

四、管道操作符实例

1、$project实例

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

>db.stu.aggregate(
    { $project : {
        name: 1 ,
        score: 1 ,
    }}
 );

结果:

aggregate match mongodb 包含 mongodb的aggregate_数组_11

这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:

>db.stu.aggregate(
    { $project : {
        _id : 0 ,
         name: 1 ,
        score: 1 ,
    }});

aggregate match mongodb 包含 mongodb的aggregate_mongodb_12

2.$match实例

db.stu.aggregate( [
                        { $match : { score : { $gt : 140, $lte :210 } } },
                        { $group: { _id: "$name", count: { $sum: 1 } } }
                       ] );

aggregate match mongodb 包含 mongodb的aggregate_数据_13

aggregate match mongodb 包含 mongodb的aggregate_操作符_14group管道操作符进行处理。

3.$skip实例

>db.stu.aggregate(
    { $skip : 2});

结果显示,跳过了小明和小红

aggregate match mongodb 包含 mongodb的aggregate_数据库_15


经过$skip管道操作符处理后,前2个文档被"过滤"掉。

4、$limit

db.stu.aggregate(
    { $limit : 2});

只显示前边两条数据

aggregate match mongodb 包含 mongodb的aggregate_mongodb_16

5、$sort

>db.stu.aggregate({ $sort: { age : -1 } });

对年龄进行降序排序输出:

aggregate match mongodb 包含 mongodb的aggregate_数组_17