2-2 MongoDB 之聚合函数查询统计-educoder上面的习题笔记
目录第一关:3-1-1聚合管道操作符将文档定制第二关:3-1-2 聚合管道操作符将文档第三关:3-1-3聚合表达式对文档数据进行统计多管道练习题:MapReduce查询:
目录
3-1 MongoDB 之聚合函数查询统计
第一关:3-1-1聚合管道操作符将文档定制
$project 修改文档结构输出
有时候我们并不会用到文档的全部内容,只是使用其中几列,这时候就可以使用 $project 进行操作;或者有时候要重命名键值(列名),也可以使用 $project。
对集合进行操作:
1、只输出作者 author 和学习人数 learning_num 信息,_id也不要不显示(_id默认是显示的)0 为不显示,非 0 为显示
db.educoder.aggregate({$project:{_id:0,author:1,learning_num:1}})
2、重命名字段名(把 learning_num 重命名为 num):
db.educoder.aggregate({$project:{course:1,authoe:1,tags:1,num:'$learning_num'}})
(红色为重命名部分,num为重命名之后名称,‘$learning_num’为被重命名的属性)
$match 筛选文档输出
有时候我们要在集合中筛选出符合特定条件的文档,这时候使用 $match 便可以很快实现。
只输出作者为“李暾”的文档:
db.educoder.aggregate({$match:{author:'李暾'}})
测试代码:
mongo
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)
db.educoder.aggregate({$project:{_id:0,course:1,learning_num:1}})
第二关:3-1-2 聚合管道操作符将文档
$limit 限制文档数量输出
有时候集合中文档数量太大,我们只想选取前几行查看一下,这时候就可以用 $limit,输出前2条文档:db.educoder.aggregate({$limit:2})
$skip 跳过前 n 条文档输出
与 $limit 相反,$skip 是跳过前 n 条文档,显示剩余文档。
将集合 educoder 中的前两条文档跳过,显示剩余文档:
($skip 接受一个数字 n,表示丢弃结果集中的前 n 个文档;)
db.educoder.aggregate({$skip:2})
$limit 与 $skip 可以组合使用:
db.educoder.aggregate([{$skip:1},{$limit:2}])
#跳过第一条,显示前两条,也就是显示第2-3条文档
db.educoder.aggregate([{$limit:2},{$skip:1}])
#显示前两条,跳过第一条,也就是显示第2条文档
$unwind 拆分数组类型字段
将 educoder 中的 tags 字段拆分成多条,每条包含数组中的一个值:
db.educoder.aggregate({$unwind:'$tags'})
group 分组输出
该操作比较常用,因为文档分组后利于我们的统计。比如,按照作者分组我们就可以统计出该集合总共有几个作者。在集合 educoder 中,按作者分组:
db.educoder.aggregate({$group:{_id:'$author'}})
$sort 排序输出
按照学习人数 learning_num 降序排序输出文档:
db.educoder.aggregate({$sort:{learning_num:-1}})
-1 代表降序排序, 1 代表升序排序。
测试编程代码:
db.educoder.aggregate({$limit:3})
db.educoder.aggregate({$sort:{learning_num:1}})
db.educoder.aggregate({$skip:2})
第三关:3-1-3聚合表达式对文档数据进行统计
1、通过aggregate()方法来获取每个作者拥有的实训数量,命名为:num_course:
db.educoder.aggregate([{$group:{_id:'$author',num_course:{$sum:1}}}])
先通过聚合管道操作符$group将author字段数据分组;
$sum:1的含义:如果前面的情况出现一次,就加1,如果后面为$sum:2,那么前面条件每满足一次就加2;
2、通过aggregate()方法来获取每个作者的实训学习总人数learning_sum:
db.educoder.aggregate([{$group:{_id:'$author',learning_sum:{$sum:'$learning_num'}}}])
编程测试代码:
db.educoder.aggregate([{$group:{_id:'$author',first_course:{$first:'$course'}}}])
db.educoder.aggregate([{$group:{_id:'$author',learning_num:{$avg:'$learning_num'}}}])
db.educoder.aggregate([{$unwind:'$tags'},{$group:{_id:'$tags',course_num:{$sum:1}}}])
多管道练习题:
db.educoder.aggregate([{$group:{_id:'$author',learning_num:{$avg:'$learning_num'}}},{$sort:{'learning_num':1}}])
db.educoder.aggregate([{$group:{_id:'$author',learning_num:{$avg:'$learning_num'}}},{$limit:2}])
db.educoder.aggregate([{$group:{_id:'$author',learning_num:{$avg:'$learning_num'}}},{$limit:2},{$skip:1},{$limit:2}])
MapReduce查询:
操作语法:
db.集合名称.mapReduce(
function(){emit(key, values)}, map:key是需要聚合的属性,values是操作值的属性
function(key, values){return Array.操作(values)}, reduce:操作:sum,avg,min,max,first
{query: 条件,
out: 存储到新的集合的名称,
sort: 条件,
limit: number
}
)
进行查询操作练习:
db.educoder.mapReduce(
function(){emit(this.author,this.learning_num);},
function(key,values){return Array.avg(values)},
{
out:"avg_num"
}
)
db.avg_num.find()
db.educoder.mapReduce(
function(){emit(this.author,this.learning_num);},
function(key,values){return Array.avg(values)},
{
out:"avg_num",
limit:2
}
)
db.avg_num.find()
db.educoder.mapReduce(
function(){emit(this.author,this.learning_num);},
function(key,values){return Array.avg(values)},
{
query: {author: "李暾"},
out:"avg_num",
}
)
db.avg_num.find()
更多推荐
所有评论(0)