MongoDB 聚合函数 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的操作