总论:高级操作
- 讲解关于mongodb的高级操作,包括聚合、主从复制、分片、备份与恢复、MR
- 完成python与mongodb的交互
一、聚合 aggregate
- 聚合(aggregate)主要用于计算数据,类似sql中的sum()、avg()
- 需要知道:在MongoliaDB中做统计,用aggregate函数
- 语法
db.集合名称.aggregate([{管道:{表达式}}])
里面是数组,所以用[],把第一个json的结果储存起来,作为第二个json的输入。
管道
- 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的输入,把上一次的输出,作为下一次的输入
ps ajx | grep mongo
- 在mongodb中,管道具有同样的作用,文档处理完毕后,通过管道进行下一次处理
- 常用管道
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
表达式
表达式:'$列名'
- 常用表达式
-
sum:计算总和,sum:1同count表示计数
- $avg:计算平均值
- $min:获取最小值
- $max:获取最大值
- $push:在结果文档中插入值到一个数组中
- $first:根据资源文档的排序获取第一个文档数据
- $last:根据资源文档的排序获取最后一个文档数据
1、$group管道
- 将集合中的文档分组,可用于统计结果
- _id表示分组的依据,使用某个字段的格式为'$字段'
- counter为结果的名字,这个属性冒号后面接需要做的操作
- 例1:统计男生、女生的总人数
db.stu.aggregate([
{$group:
{
_id:'$gender',
counter:{$sum:1}
}
}
])

未加$并未达到分组效果

不要忘记加$,$sum:1表示见到一行加一个,统计文档条数的功能

sum后面也可以$字段,则是把字段求和

$push,把按照gender字段分类好的数据放到一个数组里面,把之前MySQL中不可见的数据变成可见
Group by null
- 将集合中所有文档分为一组
- 例2:求学生总人数、平均年龄
db.stu.aggregate([
{$group:
{
_id:null,
counter:{$sum:1},
avgAge:{$avg:'$age'}
}
}
])

把集合中所有文档分一组?
透视数据push函数
db.stu.aggregate([
{$group:
{
_id:'$gender',
name:{$push:'$name'}
}
}
])
- 使用$$ROOT可以将文档内容加入到结果集的数组中,代码如下
db.stu.aggregate([
{$group:
{
_id:'$gender',
name:{$push:'$$ROOT'}
}
}
])

$$ROOT把这个文档分组后放到一起展示出来
网友评论