1. 聚合aggregate–难点
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})
2. 常用管道
- 在mongodb中,⽂档处理完毕后,通过管道进⾏下⼀次处理 常用管道如下:
- $group: 将集合中的⽂档分组, 可⽤于统计结果
- $match: 过滤数据, 只输出符合条件的⽂档
- $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
- $sort: 将输⼊⽂档排序后输出 $limit: 限制聚合管道返回的⽂档数
- $skip: 跳过指定数量的⽂档, 并返回余下的⽂档
- $unwind: 将数组类型的字段进⾏拆分
3. 常用表达式
- 处理输⼊⽂档并输出 语法:
- 表达式:’$列名’ 常⽤表达式:
- $sum: 计算总和
- $sum:1 表示以⼀倍计数
- $avg: 计算平均值
- $min: 获取最⼩值
- $max: 获取最⼤值
- $push: 在结果⽂档中插⼊值到⼀个数组中
- $first:根据资源⽂档的排序获取第⼀个⽂档数据
- $last: 根据资源⽂档的排序获取最后⼀个⽂档数据
4. $group
- $group: 将集合中的⽂档分组, 可⽤于统计结果
- 列: 统计 男生和女生的人数, 输出格式: _id:性别, counter:人数
- 输出: { “_id” : “1001”, “name” : “01”, “age” : 15, “gender” : “男” } 等等 …
db.test.aggregate(
{$group:
{
_id: '$gender',
counter: {$sum:1}
}
}
)
5. $match
- $match: 过滤数据, 只输出符合条件的⽂档
- 列: 过滤年大于20的人,统计出男生男生的人数
- 输出:
- { “_id” : “女”, “counter” : 3 } 等等…
db.test.aggregate(
{$match:{age:{$gt:20}}},
{$group:{id:"$gender", counter:{$sum:1}}}
)
6.project
- $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
- 列: 过滤年大于20的人,统计出女生男生的人数,
- 输出格式:
- { “counter” : 3, “gender” : “女” }
{ “counter” : 3, “gender” : “男” }
db.test.aggregate(
{$match:{age:{$gt:20}}},
{$group:{_id:"$gender", counter:{$sum:1}}}
{$project:{_id:0, gender:"_id", counter:1}}
)
7. $unwind
- $unwind: 将数组类型的字段进⾏拆分
- 语法:db.集合名称.aggregate({ $unwind:'$字段名称'})
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']})
db.t2.aggregate({$unwind:'$size'})
结果如下:
{ "_id" : 1, "item" : "t-shirt", "size" : "S" }
{ "_id" : 1, "item" : "t-shirt", "size" : "M" }
{ "_id" : 1, "item" : "t-shirt", "size" : "L" }