aggregate
聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果
db.collection.aggregate(AGGREGATE_OPERATION),基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
aggregate返回的是一个数组,db.collection.aggregate([...]])
常用聚合框架
- $project:可以从文档中选择想要的字段,和不想要的字段(指定的字段可以是来自输入文档或新计算字段的现有字段),也可以通过管道表达式进行一些复杂的操作,例如数学操作,日期操作,字符串操作,逻辑操作。相当于SQL中的 as
{ $project: { <specification(s)> } }
- $project 管道符的作用是选择字段(指定字段,添加字段,不显示字段 _id:0,排除字段等),重命名字段,派生字段。specifications有以下形式:
- <field>: <1 or 0> 是否包含该字段,field:1/0,表示选择/不选择 field
- _id: <1 or 0> 是否指定_id字段
- <field>: <expression> 添加新字段或重置现有字段的值。 使用 $$REMOVE 将该字段排除在输出中
- $project常用运算符
- $map、$reduce、$filter
- $range
- $add、$substract、$multiply、$divide(加减乘除)
- $substr、$concat、$toLower、$toUpper(字符串的 截取、拼接、大小写转换)
- $year、$month、$dayOfMonth、$hour、$minute、$second(取出日期时间中对应的数据)
- $match:接受一个指定查询条件的文档。查询语法与读操作查询语法相同,用于过滤数据,相当于SQL的where。
{ $match: { <query> } }
- 不能在$ match查询中使用$作为聚合管道的一部分。
- 要在$match阶段使用$text,$match阶段必须是管道的第一阶段。
- $match常用运算符:
- $eq、$gt、$gte、$lt、$lte
- $and、$or、$not、$in
- $geoWithin、$intersect
- $group:将集合中的文档分组,可用于统计结果。注意分组统计后的结果是一个文档对象还是一个数组
{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
- _id字段是必填的,表示以什么分组,但是可以指定_id值为null来统计整个集合。
- 剩余的计算字段是可选的,并使用<accumulator>运算符进行计算。
- _id和<accumulator>表达式可以接受任何有效的表达式。
- $group常用操作符如下:
- $sum(
{"$sum":1}
表示统计结果,{"$sum":"$key"}对那个key求和
),$avg,$min,$max - $push,在结果文档中插入值到一个数组中
- $addToSet,在结果文档中插入值到一个集合中。
- $first,根据资源文档的排序获取第一个文档数据。
- $last,根据资源文档的排序获取最后一个文档数据
- $limit:限制传递到管道中下一阶段的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $sort:将输入文档排序后输出。
- $unwind:将包含数组的文档拆分为多个单独的文档,每个单独文档都包含数组的值(count=array.size)
{
$unwind:
{
path: <field path>,
includeArrayIndex: <string>,
preserveNullAndEmptyArrays: <boolean>
}
}
- path:需要拆分的数组(没有下面两个参数时可以写为
{$unwind:"$key"}
) - includeArrayIndex,分配一个存该数组索引的字段,可不写
- preserveNullAndEmptyArrays,是否输出空内容。可不写
- $lookup,连接操作符,用于连接同一个数据库中另一个集合,并获取指定的文档,类似SQL的左连接,
{
$lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}
- from:同一个数据库下等待被Join的集合
- localField:当前集合中的key,如果输入的集合中,某文档没有 localField这个Key(Field),在处理的过程中,会默认为此文档含有 localField:null的键值对
- foreignField:待Join的集合的key,如果待Join的集合中,文档没有foreignField值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对
- as:为输出文档的新增key命名。如果输入的集合中已存在,则会覆盖掉
- $count:在前面的聚合操作之后 统计结果数
{ $count: <string> }
- $bucket,对集合中的某个字段做分区间统计
- $facet,对集合中的多个字段做分区间统计,就是包含多个 $bucket的操作