常用聚合管道操作符
常用的几个聚合管道操作符:
操作符 | 作用 |
---|---|
$project | 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档 |
$match | 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作 |
$limit | 用来限制MongoDB聚合管道返回的文档数 |
$skip | 在聚合管道中跳过指定数量的文档,并返回余下的文档 |
$unwind | 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 |
$group | 将集合中的文档分组,可用于统计结果 |
$sort | 将输入文档排序后输出 |
注意:以上操作不会修改集合的内容,只是将集合以指定形式输出。
在数据库 mydb1 有集合 educoder 内容如下:
_id | course | author | tags | learning_num |
---|---|---|---|---|
1 | Python表达式问题求解实训 | 李暾 | Python基础,求解 | 1882 |
2 | Java语言之基本语法 | 余跃 | Java基础,语法 | 814 |
3 | Python面向对象编程实训 | 李暾 | Python基础,面向对象 | 143 |
4 | Android综合实训之物联网移动应用开发(1) | prophet5 | Android,物联网,移动开发 | 207 |
$project 修改文档结构输出
有时候我们并不会用到文档的全部内容,只是使用其中几列,这时候就可以使用 $project 进行操作;或者有时候要重命名键值(列名),也可以使用 $project。
对集合 educoder 进行操作:
- 只输出作者 author 和学习人数 learning_num 信息,
_id
也不要不显示(_id
默认是显示的):
db.educoder.aggregate({$project:{_id:0,author:1,learning_num:1}})
- 0 为不显示,非 0 为显示。
运行结果如图1所示:
图 1
- 重命名字段名(把 learning_num 重命名为 num):
db.educoder.aggregate({$project:{course:1,authoe:1,tags:1,num:'$learning_num'}})
运行结果如图2所示:
图 2
$match 筛选文档输出
有时候我们要在集合中筛选出符合特定条件的文档,这时候使用 $match 便可以很快实现。
只输出作者为“李暾”的文档:
db.educoder.aggregate({$match:{author:'李暾'}})
运行结果如图3所示:
图 3
$limit 限制文档数量输出
有时候集合中文档数量太大,我们只想选取前几行查看一下,这时候就可以用 $limit,输出前2条文档:
db.educoder.aggregate({$limit:2})
运行结果如图4所示:
图 4
$skip 跳过前 n 条文档输出
与 $limit 相反,$skip 是跳过前 n 条文档,显示剩余文档。
将集合 educoder 中的前两条文档跳过,显示剩余文档:
db.educoder.aggregate({$skip:2})
- $skip 接受一个数字 n,表示丢弃结果集中的前 n 个文档;
运行结果如图5所示:
图 5
$limit 与 $skip 可以组合使用:
db.educoder.aggregate([{$skip:1},{$limit:2}])
#跳过第一条,显示前两条,也就是显示第2-3条文档
db.educoder.aggregate([{$limit:2},{$skip:1}])
#显示前两条,跳过第一条,也就是显示第2条文档
运行结果如图6所示:
图 6
$unwind 拆分数组类型字段
将 educoder 中的 tags 字段拆分成多条,每条包含数组中的一个值:
db.educoder.aggregate({$unwind:'$tags'})
运行结果如图7所示:
图 7
$group 分组输出
该操作比较常用,因为文档分组后利于我们的统计。比如,按照作者分组我们就可以统计出该集合总共有几个作者。
在集合 educoder 中,按作者分组:
db.educoder.aggregate({$group:{_id:'$author'}})
运行结果如图8所示:
图 8
$sort 排序输出
按照学习人数 learning_num 降序排序输出文档:
db.educoder.aggregate({$sort:{learning_num:-1}})
- -1 代表降序排序, 1 代表升序排序。
运行结果如图9所示:
图 9