On this page
聚合管道快速参考
在本页面
Note
有关特定运算符的详细信息,包括语法和示例,请单击特定运算符以转到其参考页。
Stages
Stages (db.collection.aggregate)
在db.collection.aggregate方法中,管道阶段出现在数组中。文档按 Sequences 通过各个阶段。除了$out和$geoNear阶段外,所有其他项都可以在管道中多次出现。
db.collection.aggregate( [ { <stage> }, ... ] )
Stage | Description |
---|---|
$addFields | 将新字段添加到文档。类似于$project,$addFields重塑流中的每个文档;具体而言,通过向输出文档添加新字段,该输出文档既包含 Importing 文档中的现有字段,又包含新添加的字段。 |
$bucket | 根据指定的表达式和存储段边界将传入文档分类为称为存储段的组。 |
$bucketAuto | 根据指定的表达式将传入文档分类为特定数量的组,称为存储桶。会自动确定存储区边界,以尝试将文档平均分配到指定数量的存储区中。 |
$collStats | 返回有关集合或视图的统计信息。 |
$count | 返回聚合管道此阶段的文档数计数。 |
$facet | 在同一 Importing 文档集的单个阶段中处理多个aggregation pipelines。支持在一个阶段中创建能够表征多维或多面数据的多面聚合。 |
$geoNear | 根据与地理空间点的接近程度返回有序的文档流。结合了$match,$sort和$limit的地理空间数据功能。输出文档包括附加距离字段,并且可以包括位置标识符字段。 |
$graphLookup | 对集合执行递归搜索。在每个输出文档中,添加一个新的数组字段,其中包含对该文档的递归搜索的遍历结果。 |
$group | 按指定的标识符表达式对 Importing 文档进行分组,并将累加器表达式(如果指定)应用于每个组。消耗所有 Importing 文档,并在每个不同的组中输出一个文档。输出文档仅包含标识符字段,如果指定,还包含累积字段。 |
$indexStats | 返回有关集合每个索引使用情况的统计信息。 |
$limit | 将未经修改的前* n 个文档传递到管道,其中 n 是指定的限制。对于每个 Importing 文档,输出一个文档(对于第一个 n 文档)或零文档(在第一个 n *文档之后)。 |
$listSessions | 列出所有活动时间已经足够长以传播到system.sessions 集合的会话。 |
$lookup | 对* same *数据库中的另一个集合执行左外部联接,以过滤“联接”集合中的文档以进行处理。 |
$match | 筛选文档流,以仅允许匹配的文档未经修改地传递到下一个管道阶段。 $match使用标准 MongoDB 查询。对于每个 Importing 文档,输出一个文档(匹配)或零文档(不匹配)。 |
$out | 将聚合管道的结果文档写入集合。要使用$out阶段,它必须是管道中的最后一个阶段。 |
$project | 重塑流中的每个文档,例如通过添加新字段或删除现有字段。对于每个 Importing 文档,输出一个文档。 |
$redact | 通过基于文档本身中存储的信息限制每个文档的内容,来重塑流中的每个文档。合并了$project和$match的功能。可用于实施字段级修订。对于每个 Importing 文档,输出一个或零个文档。 |
$replaceRoot | 用指定的嵌入式文档替换文档。该操作将替换 Importing 文档中的所有现有字段,包括_id 字段。指定嵌入在 Importing 文档中的文档以将嵌入的文档提升到顶层。 |
$sample | 从其 Importing 中随机选择指定数量的文档。 |
$skip | 跳过第一个* n 文档,其中 n 是指定的跳过编号,并将其余未修改的文档传递到管道。对于每个 Importing 文档,输出零个文档(对于第一个 n 个文档)或一个文档(如果在第一个 n *个文档之后)。 |
$sort | 通过指定的排序键对文档流进行重新排序。只有 Sequences 改变;这些文档保持不变。对于每个 Importing 文档,输出一个文档。 |
$sortByCount | 根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档数。 |
$unwind | 从 Importing 文档解构数组字段,以输出* each 元素的文档。每个输出文档用元素值替换数组。对于每个 Importing 文档,输出 n 个文档,其中 n *是数组元素的数量,对于空数组可以为零。 |
Stages (db.aggregate)
从 3.6 版开始,MongoDB 还提供db.aggregate方法:
db.aggregate( [ { <stage> }, ... ] )
以下阶段使用db.aggregate()方法而不是db.collection.aggregate()方法。
Stage | Description |
---|---|
$currentOp | 返回有关 MongoDB 部署的活动和/或休眠操作的信息。 |
$listLocalSessions | 列出当前在当前连接的mongos或mongod实例上使用的所有活动会话。这些会话可能尚未传播到system.sessions 集合。 |
Expressions
表达式可以包括site 路径和系统变量,literals,expression objects和expression operators。表达式可以嵌套。
字段路径和系统变量
聚合表达式使用field path来访问 Importing 文档中的字段。要指定字段路径,请使用以美元符号$
作为字段名称或虚线字段名称前缀的字符串(如果该字段位于嵌入式文档中)。例如,"$user"
指定user
字段的字段路径,或"$user.name"
指定"user.name"
字段的字段路径。
"$<field>"
等效于"$$CURRENT.<field>"
,其中CURRENT是在大多数阶段默认为当前对象根目录的系统变量,除非在特定阶段另有说明。 CURRENT可以反弹。
除CURRENT系统变量外,其他system variables也可用于表达式中。要访问表达式中的变量,请在变量名前添加$$
。
Literals
Literals 可以是任何类型。但是,MongoDB 将以美元符号$
开头的字符串 Literals 解析为字段的路径,将expression objects中的数字/布尔 Literals 解析为投影标志。为避免解析 Literals,请使用$literal表达式。
Expression Objects
表达式对象具有以下形式:
{ <field1>: <expression1>, ... }
如果表达式是数字或布尔 Literals,则 MongoDB 会将 Literals 视为投影标记(例如1
或true
以包括该字段),仅在$project阶段有效。为避免将数字或布尔 Literals 视为投影标记,请使用$literal表达式来包装数字或布尔 Literals。
Operator Expressions
在这个部分
运算符表达式类似于带有参数的函数。通常,这些表达式采用参数数组并具有以下形式:
{ <operator>: [ <argument1>, <argument2> ... ] }
如果 operator 接受单个参数,则可以省略指定参数列表的外部数组:
{ <operator>: <argument> }
为了避免在参数是 Literals 数组的情况下解析歧义,必须将 Literals 数组包装在$literal表达式中,或者保留指定参数列表的外部数组。
算术表达式运算符
算术表达式对数字执行 math 运算。一些算术表达式也可以支持日期算术。
Name | Description |
---|---|
$abs | 返回数字的绝对值。 |
$add | 添加数字以返回总和,或者添加数字和日期以返回新日期。如果添加数字和日期,则将数字视为毫秒。接受任意数量的参数表达式,但最多只能一个表达式解析为日期。 |
$ceil | 返回大于或等于指定数字的最小整数。 |
$divide | 返回第一个数字除以第二个数字的结果。接受两个参数表达式。 |
$exp | 将* e *提高到指定的指数。 |
$floor | 返回小于或等于指定数字的最大整数。 |
$ln | 计算数字的自然对数。 |
$log | 以指定的底数计算数字的对数。 |
$log10 | 计算数字的以 10 为底的对数。 |
$mod | 返回第一个数字的余数除以第二个数字。接受两个参数表达式。 |
$multiply | 乘以数字可返回乘积。接受任意数量的参数表达式。 |
$pow | 将数字提高到指定的指数。 |
$sqrt | 计算平方根。 |
$subtract | 返回从第一个值减去第二个值的结果。如果两个值是数字,则返回差值。如果两个值是日期,则以毫秒为单位返回差值。如果两个值分别是日期和以毫秒为单位的数字,则返回结果日期。接受两个参数表达式。如果两个值是日期和数字,请首先指定 date 参数,因为从数字中减去日期没有意义。 |
$trunc | 将数字截断为其整数。 |
数组表达式运算符
$arrayElemAt | 返回指定数组索引处的元素。 |
---|---|
$arrayToObject | 将键值对数组转换为文档。 |
$concatArrays | 连接数组以返回连接的数组。 |
$filter | 选择数组的子集以返回仅包含与过滤条件匹配的元素的数组。 |
$in | 返回一个布尔值,指示指定的值是否在数组中。 |
$indexOfArray | 在数组中搜索指定值的出现,并返回第一个出现的数组索引。如果未找到子字符串,则返回-1 。 |
$isArray | 确定操作数是否为数组。返回一个布尔值。 |
$map | 对数组的每个元素应用子表达式,并按 Sequences 返回结果值的数组。接受命名参数。 |
$objectToArray | 将文档转换为代表键值对的文档数组。 |
$range | 根据用户定义的 Importing 输出包含整数序列的数组。 |
$reduce | 将表达式应用于数组中的每个元素,并将它们组合为单个值。 |
$reverseArray | 返回具有相反 Sequences 元素的数组。 |
$size | 返回数组中的元素数。接受单个表达式作为参数。 |
$slice | 返回数组的子集。 |
$zip | 合并两个数组。 |
布尔表达式运算符
布尔表达式将其参数表达式评估为布尔值,并返回布尔值作为结果。
除了false
布尔值外,布尔表达式还将以下值评估为false
:null
,0
和undefined
值。布尔表达式将所有其他值评估为true
,包括非零数字值和数组。
Name | Description |
---|---|
$and | 仅在其所有*表达式的计算结果为true 时返回true 。接受任意数量的参数表达式。 |
$not | 返回与其参数表达式相反的布尔值。接受单个参数表达式。 |
$or | 当**的任何表达式的值为true 时,返回true 。接受任意数量的参数表达式。 |
比较表达式运算符
比较表达式返回一个布尔值,除了$cmp返回一个数字。
比较表达式采用两个参数表达式,并使用指定的 BSON 比较 Sequences来比较不同类型的值,同时比较值和类型。
$cmp | 如果两个值相等,则返回0 ;如果第一个值大于第二个值,则返回1 ;如果第一个值小于第二个值,则返回-1 。 |
---|---|
$eq | 如果值相等,则返回true 。 |
$gt | 如果第一个值大于第二个值,则返回true 。 |
$gte | 如果第一个值大于或等于第二个,则返回true 。 |
$lt | 如果第一个值小于第二个值,则返回true 。 |
$lte | 如果第一个值小于或等于第二个,则返回true 。 |
$ne | 如果值不相等则返回true 。 |
条件表达式运算符
Name | Description |
---|---|
$cond | 一个三元运算符,它对一个表达式求值,并根据结果返回其他两个表达式之一的值。接受有序列表中的三个表达式或三个命名参数。 |
$ifNull | 如果第一个表达式的结果为空,则返回第一个表达式的非空结果或第二个表达式的结果。空结果包含未定义值或缺少字段的实例。接受两个表达式作为参数。第二个表达式的结果可以为 null。 |
$switch | 计算一系列案例表达式。当它找到一个计算结果为true 的表达式时,$switch 执行指定的表达式并退出控制流程。 |
日期表达式运算符
以下运算符返回日期对象或日期对象的组成部分:
Name | Description |
---|---|
$dateFromParts | 给定日期的组成部分,构造一个 BSON Date 对象。 |
$dateFromString | 将日期/时间字符串转换为日期对象。 |
$dateToParts | 返回包含日期组成部分的文档。 |
$dateToString | 以格式字符串返回日期。 |
$dayOfMonth | 以 1 到 31 之间的数字返回日期的月份。 |
$dayOfWeek | 以 1(星期日)至 7(星期六)之间的数字返回日期的星期几。 |
$dayOfYear | 以 1 到 366(le 年)之间的数字返回日期中的日期。 |
$hour | 以 0 到 23 之间的数字返回日期的小时。 |
$isoDayOfWeek | 以 ISO 8601 格式返回工作日编号,范围从1 (对于星期一)到7 (对于星期日)。 |
$isoWeek | 以 ISO 8601 格式返回星期数,范围从1 到53 。星期编号从1 开始,其中包含该年的第一个星期四的星期(星期一至星期日)。 |
$isoWeekYear | 以 ISO 8601 格式返回年份。年份从第 1 周的星期一(ISO 8601)开始,到最后一周的星期日(ISO 8601)结束。 |
$millisecond | 以 0 到 999 之间的数字返回日期的毫秒数。 |
$minute | 以 0 到 59 之间的数字返回日期的分钟。 |
$month | 以 1(一月)至 12(十二月)之间的数字返回日期的月份。 |
$second | 以 0 到 60 之间的数字返回日期的秒数((秒)。 |
$week | 返回日期的星期数,其范围为 0(该年的第一个星期日之前的部分星期)和 53(le 年)之间的数字。 |
$year | 以数字形式返回日期的年份(例如 2014)。 |
以下算术运算符可以采用日期操作数:
Name | Description |
---|---|
$add | 添加数字和日期以返回新日期。如果添加数字和日期,则将数字视为毫秒。接受任意数量的参数表达式,但最多只能一个表达式解析为日期。 |
$subtract | 返回从第一个值减去第二个值的结果。如果两个值是日期,则以毫秒为单位返回差值。如果两个值分别是日期和以毫秒为单位的数字,则返回结果日期。接受两个参数表达式。如果两个值是日期和数字,请首先指定 date 参数,因为从数字中减去日期没有意义。 |
Literals 运算符
对象表达式运算符
Name | Description |
---|---|
$mergeObjects | 将多个文档合并为一个文档。 |
3.6 版中的新功能。
| $objectToArray |将文档转换为代表键值对的文档数组。
3.6 版中的新功能。
设置表达式运算符
集表达式对数组执行集运算,将数组视为集。集合表达式将忽略每个 Importing 数组中的重复条目以及元素的 Sequences。
如果 set 操作返回一个 set,则该操作会滤除结果中的重复项,以输出仅包含唯一条目的数组。输出数组中元素的 Sequences 未指定。
如果集合包含嵌套数组元素,则 set 表达式不会*降到嵌套数组中,而是在顶级对数组进行求值。
Name | Description |
---|---|
$allElementsTrue | 如果集合的* no *元素的值等于false ,则返回true ;否则,返回false 。接受单个参数表达式。 |
$anyElementTrue | 如果集合的* any *个元素的值为true ,则返回true ;否则,返回false 。接受单个参数表达式。 |
$setDifference | 返回具有出现在第一个集合中但不出现在第二个集合中的元素的集合;即执行相对于第一组的relative complement。正好接受两个参数表达式。 |
$setEquals | 如果 Importing 集具有相同的不同元素,则返回true 。接受两个或多个参数表达式。 |
$setIntersection | 返回带有出现在 Importing 集的“全部”中的元素的集合。接受任意数量的参数表达式。 |
$setIsSubset | 如果第一个集合的所有元素都出现在第二个集合中(包括第一个集合等于第二个集合时),则返回true ;否则返回true 。即不是strict subset。正好接受两个参数表达式。 |
$setUnion | 返回带有出现在 Importing 集的“任意”中的元素的集合。 |
字符串表达式运算符
字符串表达式(除了$concat除外)仅对于 ASCII 字符字符串具有明确定义的行为。
$concat行为明确定义,无论使用什么字符。
Name | Description |
---|---|
$concat | 连接任意数量的字符串。 |
$dateFromString | 将日期/时间字符串转换为日期对象。 |
$dateToString | 以格式字符串返回日期。 |
$indexOfBytes | 在字符串中搜索子字符串的出现,并返回第一次出现的 UTF-8 字节索引。如果未找到子字符串,则返回-1 。 |
$indexOfCP | 在字符串中搜索子字符串的出现,并返回第一次出现的 UTF-8 代码点索引。如果未找到子字符串,则返回-1 |
$split | 根据定界符将字符串拆分为子字符串。返回子字符串数组。如果在字符串中找不到分隔符,则返回包含原始字符串的数组。 |
$strLenBytes | 返回字符串中 UTF-8 编码的字节数。 |
$strLenCP | 返回字符串中的 UTF-8 code points的数量。 |
$strcasecmp | 执行不区分大小写的字符串比较,并返回:如果两个字符串相等,则返回0 ;如果第一个字符串大于第二个字符串,则返回1 ;如果第一个字符串小于第二个字符串,则返回-1 。 |
$substr | 不推荐使用。使用$substrBytes或$substrCP。 |
$substrBytes | 返回字符串的子字符串。从字符串中指定的 UTF-8 字节索引(从零开始)处的字符开始,并 continue 指定的字节数。 |
$substrCP | 返回字符串的子字符串。从字符串中指定的 UTF-8 代码点(CP)索引(从零开始)处的字符开始,并 continue 指定的代码点数。 |
$toLower | 将字符串转换为小写。接受单个参数表达式。 |
$toUpper | 将字符串转换为大写。接受单个参数表达式。 |
Literals 表达运算符
Name | Description |
---|---|
$meta | 访问文本搜索元数据。 |
类型表达式运算符
Name | Description |
---|---|
$type | 返回该字段的 BSON 数据类型。 |
Accumulators ($group)
累加器是可以在$group阶段使用的运算符,它们会随着文档在管道中的前进而保持其状态(例如总计,最大值,最小值和相关数据)。
在$group阶段用作累加器时,这些运算符将单个表达式作为 Importing,对每个 Importing 文档评估一次该表达式,并为共享同一组键的文档组维护其阶段。
Name | Description |
---|---|
$addToSet | 返回每个组的唯一表达式值的数组。数组元素的 Sequences 未定义。 |
$avg | 返回数值的平均值。忽略非数字值。 |
$first | 从每个组的第一个文档返回一个值。仅当文档按定义的 Sequences 定义 Sequences。 |
$last | 从每个组的最后一个文档返回一个值。仅当文档按定义的 Sequences 定义 Sequences。 |
$max | 返回每个组的最高表达式值。 |
$mergeObjects | 返回通过合并每个组的 Importing 文档而创建的文档。 |
$min | 返回每个组的最低表达式值。 |
$push | 返回每个组的表达式值的数组。 |
$stdDevPop | 返回 Importing 值的总体标准偏差。 |
$stdDevSamp | 返回 Importing 值的 samples 标准偏差。 |
$sum | 返回数值的总和。忽略非数字值。 |
累加器($ project 和$ addFields)
可用作$group阶段的累加器的某些运算符也可用于$project和$addFields阶段,但不能用作累加器。当在$project和$addFields阶段中使用时,这些运算符不会保持其状态,并且可以将单个参数或多个参数作为 Importing。
在版本 3.2 中更改。
在$project和$addFields阶段中,以下累加器运算符也可用。
Name | Description |
---|---|
$avg | 返回每个文档的指定表达式或表达式列表的平均值。忽略非数字值。 |
$max | 返回每个文档的指定表达式或表达式列表的最大值 |
$min | 返回每个文档的指定表达式或表达式列表的最小值 |
$stdDevPop | 返回 Importing 值的总体标准偏差。 |
$stdDevSamp | 返回 Importing 值的 samples 标准偏差。 |
$sum | 返回数值的总和。忽略非数字值。 |
变量表达式运算符
Name | Description |
---|---|
$let | 定义要在子表达式范围内使用的变量,并返回子表达式的结果。接受命名参数。 |
接受任意数量的参数表达式。