目录

第一关: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)},   mapkey是需要聚合的属性,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()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐