2-2 MongoDB 之聚合函数查询统计
第1关:3-1-1聚合管道操作符将文档定制格式输出(一)
文档内容如下:
{
_id:1,
course:'Python表达式问题求解实训',
author:'李暾',
tags:['Python基础','求解'],
learning_num:1882
},
{
_id:2,
course:'Java语言之基本语法',
author:'余跃',
tags:['Java基础','语法'],
learning_num:814
},
{
_id:3,
course:'Python面向对象编程实训',
author:'李暾',
tags:['Python基础','面向对象'],
learning_num:143
},
{
_id:4,
course:'Android综合实训之物联网移动应用开发(1)',
author:'prophet5',
tags:['Android','物联网','移动开发'],
learning_num:207
}
将文档插入数据库 test1 中的集合 educoder 中
use test1;
document=[{_id:1,course:"Python表达式问题求解实训",author:"李暾",tags:["Python基础","求解"],learning_num:1882},{_id:2,course:"Java语言之基本语法",author:"余跃",tags:["Java基础","语法"],learning_num:814},{_id:3,course:"Python面向对象编程实训",author:"李暾",tags:["Python基础","面向对象"],learning_num:143},{_id:4,course:"Android综合实训之物联网移动应用开发(1)",author:"prophet5",tags:["Android","物联网","移动开发"],learning_num:207}];
db.educoder.insert(document)
常用聚合管道操作符
常用的几个聚合管道操作符:
操作符 | 作用 |
---|---|
$project | 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档 |
$match | 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作 |
$limit | 用来限制MongoDB聚合管道返回的文档数 |
$skip | 在聚合管道中跳过指定数量的文档,并返回余下的文档 |
$unwind | 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 |
$group | 将集合中的文档分组,可用于统计结果 |
$sort | 将输入文档排序后输出 |
注意:以上操作不会修改集合的内容,只是将集合以指定形式输出。
文档输出时只保留 course 和 learning_num 字段(_id
也不要保留)
有时候我们并不会用到文档的全部内容,只是使用其中几列,这时候就可以使用 $project 进行操作;或者有时候要重命名键值(列名),也可以使用 $project。
db.educoder.aggregate({\$project:{_id:0,course:1,learning_num:1}});
0 为不显示,非 0 为显示。
输出学习人数 learning_num 为1882档
$match 筛选文档输出
有时候我们要在集合中筛选出符合特定条件的文档,这时候使用 $match 便可以很快实现。
db.educoder.aggregate({\$match:{learning_num:82}});
注:题目中写的是82档,实际应该是1882档
由于测试需要,请在代码里
$
符号前添加转义符\
,不需要有空格,格式如:\$
,平时在命令行操作不需要
第2关:3-1-2 聚合管道操作符将文档定制格式输出(二)
将文档插入数据库 test2 中的集合 educoder 中
use test2;
document=[{_id:1,course:"Python表达式问题求解实训",author:"李暾",tags:["Python基础","求解"],learning_num:1882},{_id:2,course:"Java语言之基本语法",author:"余跃",tags:["Java基础","语法"],learning_num:814},{_id:3,course:"Python面向对象编程实训",author:"李暾",tags:["Python基础","面向对象"],learning_num:143},{_id:4,course:"Android综合实训之物联网移动应用开发(1)",author:"prophet5",tags:["Android","物联网","移动开发"],learning_num:207}];
db.educoder.insert(document)
输出集合前3条文档
有时候集合中文档数量太大,我们只想选取前几行查看一下,这时候就可以用 $limit
db.educoder.aggregate({\$limit:3});
将文档按照学习人数 learning_num 升序排序
db.educoder.aggregate({\$sort:{learning_num:1}});
-1 代表降序排序, 1 代表升序排序。
输出除了前两条以外的文档
与 $limit 相反,$skip 是跳过前 n 条文档,显示剩余文档
db.educoder.aggregate({\$skip:2});
$skip 接受一个数字 n,表示丢弃结果集中的前 n 个文档;
由于测试需要,请在代码里
$
符号前添加转义符\
,不需要有空格,格式如:\$
,平时在命令行操作不需要
第3关:3-1-3聚合表达式对文档数据进行统计
将文档插入数据库 test3 中的集合 educoder 中
use test3;
document=[{_id:1,course:"Python表达式问题求解实训",author:"李暾",tags:["Python基础","求解"],learning_num:1882},{_id:2,course:"Java语言之基本语法",author:"余跃",tags:["Java基础","语法"],learning_num:814},{_id:3,course:"Python面向对象编程实训",author:"李暾",tags:["Python基础","面向对象"],learning_num:143},{_id:4,course:"Android综合实训之物联网移动应用开发(1)",author:"prophet5",tags:["Android","物联网","移动开发"],learning_num:207}];
db.educoder.insert(document)
聚合表达式
常用的几个聚合表达式:
表达式 | 用法 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值的最小值 |
$max | 获取集合中所有文档对应值的最大值 |
$push | 在结果文档中插入值到一个数组中 |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 |
$first | 根据资源文档的排序获取第一个文档数据 |
$last | 根据资源文档的排序获取最后一个文档数据 |
将文档按照作者author
分组,然后取得每个组的第一个实训名first_course
db.educoder.aggregate([{\$group:{_id:'\$author',first_course:{\$first:'\$course'}}}]);
查询跟随每个作者author
的平均学习人数learning_avg
db.educoder.aggregate([{\$group:{_id:'\$author',learning_avg:{\$avg:'\$learning_num'}}}]);
统计集合中各tags
拥有的课程数量course_num
(提示:先将tags
字段使用$unwind
拆分再统计)
db.educoder.aggregate([{\$unwind:'\$tags'},{\$group:{_id:'\$tags',course_num:{\$sum:1}}}]);
注:题目要求统计
总人数
,实际是统计课程数量
由于测试需要,请在代码里
$
符号前添加转义符\
,不需要有空格,格式如:\$
,平时在命令行操作不需要