文章目录
- 前言
- 一、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
})
查看结果:
按成绩来分组统计成绩相同的数量(统计数量)
db.stu.aggregate([{$group : {_id : "$score", num_score : {$sum : 1}}}])
以上实例类似sql语句:
select score, count(*) from stu group by score
二、其他聚合的表达式 实例
1.计算分组求和:$sum
db.stu.aggregate([{$group : {_id : "$name", num_score : {$sum : "$score"}}}])
类似:
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"}}}])
4、获取集合中所有文档对应值得最大值。$max
db.stu.aggregate([{$group : {_id : "$name", num_score : {$max: "$score"}}}])
5、在结果文档中插入值到一个数组中。$push
db.stu.aggregate([{$group : {_id : "$name", num_score : {$push: "$age"}}}])
6、在结果文档中插入值到一个数组中,但不创建副本。$addToSet
db.stu.aggregate([{$group : {_id : "$name", num_score : {$addToSet: "$age"}}}])
7、根据资源文档的排序获取第一个文档数据。$first
db.stu.aggregate([{$group : {_id : "$name", first : {$first: "$age"}}}])
8、根据资源文档的排序获取最后一个文档数据$last
db.stu.aggregate([{$group : {_id : "$name", first : {$last: "$age"}}}])
三、管道
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- **match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
四、管道操作符实例
1、$project实例
修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
>db.stu.aggregate(
{ $project : {
name: 1 ,
score: 1 ,
}}
);
结果:
这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:
>db.stu.aggregate(
{ $project : {
_id : 0 ,
name: 1 ,
score: 1 ,
}});
2.$match实例
db.stu.aggregate( [
{ $match : { score : { $gt : 140, $lte :210 } } },
{ $group: { _id: "$name", count: { $sum: 1 } } }
] );
group管道操作符进行处理。
3.$skip实例
>db.stu.aggregate(
{ $skip : 2});
结果显示,跳过了小明和小红
经过$skip管道操作符处理后,前2个文档被"过滤"掉。
4、$limit
db.stu.aggregate(
{ $limit : 2});
只显示前边两条数据
5、$sort
>db.stu.aggregate({ $sort: { age : -1 } });
对年龄进行降序排序输出: