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;

image-20210924202850580

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}];

image-20210924202819400

db.educoder.insert(document)

image-20210924202928660

常用聚合管道操作符

常用的几个聚合管道操作符:

操作符作用
$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;

image-20210924204530616

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}];

image-20210924202819400

db.educoder.insert(document)

image-20210924202928660

输出集合前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;

image-20210924205306322

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}];

image-20210924202819400

db.educoder.insert(document)

image-20210924202928660

聚合表达式

常用的几个聚合表达式:

表达式用法
$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}}}]);

注:题目要求统计总人数,实际是统计课程数量

由于测试需要,请在代码里$符号前添加转义符\,不需要有空格,格式如:\$,平时在命令行操作不需要

最后修改:2021 年 10 月 11 日 10 : 55 AM