十八、MongoDB 之聚合函数查询统计
第1关:聚合管道操作符将文档定制格式输出(一)
任务描述
本关任务:按照编程要求,对集合 educoder 进行相应的查询输出。
相关知识
为了完成本关任务,你需要掌握:
1.聚合管道操作符的作用;
2.$project 的用法;
3.$match 的用法。
常用聚合管道操作符
常用的几个聚合管道操作符:
操作符 作用
$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
编程要求
为了减少你的工作量,给出以下文档内容:
{
_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 中,然后仿照例子中的查询方法,再在右侧代码栏 Begin-End 的中按要求输入符合以下两条要求的命令,以分号;隔开(由于测试需要,请在代码里$符号前添加转义符`,不需要有空格,格式如:`$,平时在命令行操作不需要):
文档输出时只保留 course 和 learning_num 字段(_id也不要保留);
输出学习人数 learning_num 为82档。
具体的返回结果,请查看测试集。
测试说明
平台会对你编写的代码进行测试:
将你在代码行编写的命令传到数据库中操作,检测返回结果是否和目标一致。
开始你的任务吧,祝你成功!
#********* Begin *********#
echo "
db.educoder.aggregate({\$project:{_id:0,course:1,learning_num:1}});
db.educoder.aggregate({\$match:{learning_num:1882}});
"
#********* End *********#
有任何问题都可以随时关注私信!