聚合查询(Aggregation Pipeline Stages) 是将多种查询组合在一起,每一个查询阶段称为管道(pipeline),每一个管道由若干个步骤(stage)构成。
聚合查询使用在 db.collection.aggregate() 或 db.aggregate() 这2个函数中。
注意:
$out、$merge、$geoNear 这3个步骤只能出现1次,其他步骤函数可以出现使用多次。
语法 | 解释 |
---|---|
$addFields | 想元素添加字段属性值,同$set |
$bucket | 根据表达式和bucket边界将文档分类为组 |
$bucketAuto | 根据表达式和自动确定的bucket边界将文档分类为组 |
$collStats | 返回集合或视图的统计信息 |
$count | 返回文档数量 |
$facet | 在某个管道阶段允许创建多个子聚合管道查询 |
$geoNear | 根据地理空间接近程度返回有序的文档流,文档中包含一个附加的距离字段 |
$graphLookup | 向集合执行递归搜索,并向返回文档中添加一个新的数字字段,包含递归遍历结果 |
$group | 将输出文档字段属性进行重新归类整理 |
$indexStats | 返回集合使用的每个索引的统计信息 |
$limit | 限定输出文档数量 |
$listSessions | 当前会话中的Sessions列表 |
$lookup | 对同一分片下的多个集合进行关联查询 |
$match | 过滤文档流 |
$merge | 将聚合管道的结果文档写入集合,必须是聚合查询管道中的最后一个阶段 |
$out | 将聚合管道的结果文档写入结合,必须是聚合查询管道中的最后一个阶段 |
$planCacheStats | 返回集合的计划缓存信息 |
$project | 有选择性的重置输出文档中的各个字段属性,同$unset |
$redact | 通过文档本身的信息来限制输出文档的内容,包含$project和$match功能 |
$replaceRoot | 用指定的嵌入文档替换文档,同$replaceWith |
$replaceWith | 用指定的潜入文档替换文档,同$replaceRoot |
$sample | 从输入中随机选择指定数量的文档 |
$set | 修改或新增字段,同$addFields |
$skip | 跳过前n个文档 |
$sort | 按指定方式(升序或降序)进行重新排序 |
$sortByCount | 根据指定表达式的值进行文档分组,并计算不同文档组中的数量 |
$unset | 删除或排除某字段,同$project |
$unwind | 解构输入文档中的数组,将数组中每个元素解构为若干个字段 |
修饰表达运算符可用户聚合查询管道阶段中,即每个步骤中。可以将修饰表达运算符理解成接受参数的函数。
根据不同的功能,可以将修饰表达运算符分为以下几类:
类型 | 解释 |
---|---|
算术运算修饰符 | 对数字进行不用方式的运算,例如取绝对值、平方等 |
数组运算修饰符 | 对数组进行不同方式的运算,例如判断是否为数组、数组内执行map运算等 |
布尔值运算修饰符 | 对布尔值进行不同方式的运算,例如取反运算 $not |
比较运算修饰符 | 对属性值进行不同方式的比较运算,例如判断是否大于、小于等 |
条件运算修饰符 | 对属性值进行不同方式的条件运算,例如判断是否为null |
日期运算修饰符 | 对日期进行不同方式的运算,例如转化时间格式 |
字面运算修饰符 | 对属性值进行字面返回,而不进行解析,目前只有$literal一个运算修饰符 |
Object运算修饰符 | 对Object对象进行不同方式的运算,例如将多个object合并为一个object |
Set运算修饰符 | 对Set步骤进行不同方式的修饰运算 |
字符串运算修饰符 | 对String进行不同方式的运算 |
文本搜索运算修饰符 | 对文本搜索元数据进行修饰符运算,目前只有$meta一个运算修饰符 |
三角形运算修饰符 | 对三角形进行不同方式的运算,例如求cos等 |
类型转换修饰符 | 对类型进行不同方式的运算,例如将属性值转化为布尔值类型 |
$group运算修饰符 | 在$group中进行不同方式的运算 |
对非$group运算修饰符 | 对于非$group的其他步骤中进行不同方式的运算 |
声明变量运算修饰符 | 定义在子表达式内使用的变量,目前只有$let一个运算修饰符 |