aggregate
聚合框架是一个计算框架,类似于sql中的group by, join操作
整个聚合运算过程称为管道,由多个步骤组成:
原始数据 -> 步骤1 -> 中间结果1 -> 步骤2 -> 中间结果2 -> … -> 最终结果
聚合操作优先使用aggregate,相对来说较为高效
聚合运算的基本格式
pipeline = [stage1, stage2, ..., stageN]
db.COLLECTION.aggregate(pipeline, {options})
步骤类型
$match: 过滤 类似于where
$project: 投影 类似于AS
$sort: 排序 类似于ORDER BY
$group: 分组 类似于GROUP BY
$skip/$limit : 限制 类似于SKIP/LIMIT
$lookup:左外连接 LEFT OUTER JOIN
聚合函数
对于大的数据集,聚合函数通常执行起来满足不了用户对速度的需求
-
group
group不会处理多余10000个唯一键且返回的结果集不能超过16MB,通常情况下速度快于map-reduce。
group包含的参数:- key:描述分组字段的文档,比如要根据uerName分组,就将{userName:true}作为键
- keyf:一个js函数,为文档生成一个键,这个函数生成{day:1}这样的键
- initial:作为聚合结果初始值的文档
- reduce:用语执行聚合的js函数,该函数有两个参数:正在被迭代的当前文档和用语存储聚合结果的聚合器文档,reduce并不返回任何内容
- cond:过滤聚合文档的查询选择器,比如只想聚合5个以上投票的文档可以使用{value_count:{"$gt":5}}
- finalize:在返回结果集之前应用于每个结果文档的js函数
-
map_reduce
map_reduce所含参数:- map:应用于每个文档上的js函数,该函数必须调用emit()来选择要聚合的键和值
- reduce:一个js函数,接受一个键和一个值列表,该函数返回值结构必须于values数组中所提供的结构一致
- query:用于过滤映射处理集合,类似于group的cond参数
- sort:排序
- limit:限制查询和排序条数
- out:决定了如何返回输出内容
- finalize:js函数,在reduce阶段完成后会应用于每个返回的文档上
- scope:指定了map,reduce,finalize函数可全局访问的变量的值
- verbose:一个布尔值,为true时,返回的文档中包含map_reduce任务执行时间的统计