头歌实践教学平台:大数据存储2023(十八2)
2026/9/3 17:20:38 网站建设 项目流程

十八、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 *********#

有任何问题都可以随时关注私信!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询