MongoDB 聚合函数 aggregate

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

posted @ 2020-12-20 17:19  huiyii  阅读(1120)  评论(0编辑  收藏  举报