zoukankan      html  css  js  c++  java
  • 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的操作

  • 相关阅读:
    SQL临时表加分页操作
    JS 操作Url参数
    C#字符串根据特定字符串分割
    windows下python读写excel
    怎样才是更好的自己 多好才算更好的未来
    IndentationError: unindent does not match any outer indentation level
    LinAlgError: Array must not contain infs or NaNs
    c#操作xml
    sql索引碎片产生的原理 解决碎片的办法(sql碎片整理)(转)
    利用sys.dm_db_index_physical_stats查看索引碎片等数据(转)
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164204.html
Copyright © 2011-2022 走看看