十八、MongoDB 之聚合函数查询统计
第2关:聚合管道操作符将文档定制格式输出(二)
任务描述
本关任务:按照编程要求,对集合 educoder 进行相应的查询输出。
相关知识
上一关已经了解了 project和match 的用法,本关就介绍剩余管道操作符的用法。
在数据库 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
$limit 限制文档数量输出
有时候集合中文档数量太大,我们只想选取前几行查看一下,这时候就可以用 $limit,输出前2条文档:
db.educoder.aggregate({$limit:2})
运行结果如图1所示:
图 1
$skip 跳过前 n 条文档输出
与 limit相反,skip 是跳过前 n 条文档,显示剩余文档。
将集合 educoder 中的前两条文档跳过,显示剩余文档:
db.educoder.aggregate({$skip:2})
$skip 接受一个数字 n,表示丢弃结果集中的前 n 个文档;
运行结果如图2所示:
图 2
limit与skip 可以组合使用,:
db.educoder.aggregate([{$skip:1},{$limit:2}])
#跳过第一条,显示前两条,也就是显示第2-3条文档
db.educoder.aggregate([{$limit:2},{$skip:1}])
#显示前两条,跳过第一条,也就是显示第2条文档
运行结果如图3所示:
图 3
$unwind 拆分数组类型字段
将 educoder 中的 tags 字段拆分成多条,每条包含数组中的一个值:
db.educoder.aggregate({$unwind:'$tags'})
运行结果如图4所示:
图 4
$group 分组输出
该操作比较常用,因为文档分组后利于我们的统计。比如,按照作者分组我们就可以统计出该集合总共有几个作者。
在集合 educoder 中,按作者分组:
db.educoder.aggregate({$group:{_id:'$author'}})
运行结果如图5所示:
图 5
$sort 排序输出
按照学习人数 learning_num 降序排序输出文档:
db.educoder.aggregate({$sort:{learning_num:-1}})
-1 代表降序排序, 1 代表升序排序。
运行结果如图6所示:
图 6
编程要求
为了减少你的工作量,给出以下文档内容:
{
_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
}
先在命令行中操作,将上述文档插入数据库 test2 中的集合 educoder 中,然后仿照例子中的查询方法,再在右侧代码栏 Begin-End 中按要求输入符合以下3条要求的命令,以分号;隔开(由于测试需要,请在代码里$符号前添加转义符`,不需要有空格,格式如:`$,平时在命令行操作不需要):
输出集合前3条文档;
将文档按照学习人数 learning_num 升序排序;
输出除了前两条以外的文档。
测试说明
平台会对你编写的代码进行测试:
将你在代码行编写的命令传到数据库中操作,检测返回结果是否和目标一致。
开始你的任务吧,祝你成功!
#********* Begin *********#
echo "
db.educoder.aggregate({\$limit:3});
db.educoder.aggregate({\$sort:{learning_num:1}});
db.educoder.aggregate({\$skip:2});
"
#********* End *********#
有任何问题都可以随时关注私信!