Loading... # 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}}}]); ``` > 注:题目要求统计`总人数`,实际是统计`课程数量` > **由于测试需要**,请在代码里`$`符号前添加转义符`\`,不需要有空格,格式如:`\$`,平时在命令行操作不需要 最后修改:2021 年 10 月 11 日 10 : 55 AM © 允许规范转载