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的操作