聚合管道运算符

Note

有关特定运算符的详细信息,包括语法和示例,请单击特定运算符以转到其参考页。

Expression Operators

在这个部分

这些表达式运算符可用于构造expressions以便在聚合管道阶段中使用。

运算符表达式类似于带有参数的函数。通常,这些表达式采用参数数组并具有以下形式:

{ <operator>: [ <argument1>, <argument2> ... ] }

如果 operator 接受单个参数,则可以省略指定参数列表的外部数组:

{ <operator>: <argument> }

为了避免在参数是 Literals 数组的情况下解析歧义,必须将 Literals 数组包装在$literal表达式中,或者保留指定参数列表的外部数组。

算术表达式运算符

算术表达式对数字执行 math 运算。一些算术表达式也可以支持日期算术。

NameDescription
$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布尔值外,布尔表达式还将以下值评估为falsenull0undefined值。布尔表达式将所有其他值评估为true,包括非零数字值和数组。

NameDescription
$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

条件表达式运算符

NameDescription
$cond一个三元运算符,它对一个表达式求值,并根据结果返回其他两个表达式之一的值。接受有序列表中的三个表达式或三个命名参数。
$ifNull如果第一个表达式的结果为空,则返回第一个表达式的非空结果或第二个表达式的结果。空结果包含未定义值或缺少字段的实例。接受两个表达式作为参数。第二个表达式的结果可以为 null。
$switch计算一系列案例表达式。当它找到一个计算结果为true的表达式时,$switch执行指定的表达式并退出控制流程。

日期表达式运算符

以下运算符返回日期对象或日期对象的组成部分:

NameDescription
$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 格式返回星期数,范围从153。星期编号从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)。

以下算术运算符可以采用日期操作数:

NameDescription
$add添加数字和日期以返回新日期。如果添加数字和日期,则将数字视为毫秒。接受任意数量的参数表达式,但最多只能一个表达式解析为日期。
$subtract返回从第一个值减去第二个值的结果。如果两个值是日期,则以毫秒为单位返回差值。如果两个值分别是日期和以毫秒为单位的数字,则返回结果日期。接受两个参数表达式。如果两个值是日期和数字,请首先指定 date 参数,因为从数字中减去日期没有意义。

Literals 运算符

NameDescription
$literal返回一个没有解析的值。用于聚合管道可以解释为表达式的值。例如,对以$开头的字符串使用$literal表达式,以避免将其解析为字段路径。

对象表达式运算符

NameDescription
$mergeObjects将多个文档合并为一个文档。


3.6 版中的新功能。
| $objectToArray |将文档转换为代表键值对的文档数组。
3.6 版中的新功能。

设置表达式运算符

集表达式对数组执行集运算,将数组视为集。集合表达式将忽略每个 Importing 数组中的重复条目以及元素的 Sequences。

如果 set 操作返回一个 set,则该操作会滤除结果中的重复项,以输出仅包含唯一条目的数组。输出数组中元素的 Sequences 未指定。

如果集合包含嵌套数组元素,则 set 表达式不会*降到嵌套数组中,而是在顶级对数组进行求值。

NameDescription
$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行为明确定义,无论使用什么字符。

NameDescription
$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 表达运算符

NameDescription
$meta访问文本搜索元数据。

类型表达式运算符

NameDescription
$type返回该字段的 BSON 数据类型。

Accumulators ($group)

累加器是可以在$group阶段使用的运算符,它们会随着文档在管道中的前进而保持其状态(例如总计,最大值,最小值和相关数据)。

$group阶段用作累加器时,这些运算符将单个表达式作为 Importing,对每个 Importing 文档评估一次该表达式,并为共享同一组键的文档组维护其阶段。

NameDescription
$addToSet返回每个组的唯一表达式值的数组。数组元素的 Sequences 未定义。
$avg返回数值的平均值。忽略非数字值。
$first从每个组的第一个文档返回一个值。仅当文档按定义的 Sequences 定义 Sequences。
$last从每个组的最后一个文档返回一个值。仅当文档按定义的 Sequences 定义 Sequences。
$max返回每个组的最高表达式值。
$mergeObjects返回通过合并每个组的 Importing 文档而创建的文档。
$min返回每个组的最低表达式值。
$push返回每个组的表达式值的数组。
$stdDevPop返回 Importing 值的总体标准偏差。
$stdDevSamp返回 Importing 值的 samples 标准偏差。
$sum返回数值的总和。忽略非数字值。

Accumulators ($project)

可用作$group阶段的累加器的某些运算符也可用于$project阶段,但不能用作累加器。在$project阶段中使用时,这些运算符不会保持其状态,并且可以将单个参数或多个参数作为 Importing。

在版本 3.2 中更改。

$project$addFields阶段中,以下累加器运算符也可用。

NameDescription
$avg返回每个文档的指定表达式或表达式列表的平均值。忽略非数字值。
$max返回每个文档的指定表达式或表达式列表的最大值
$min返回每个文档的指定表达式或表达式列表的最小值
$stdDevPop返回 Importing 值的总体标准偏差。
$stdDevSamp返回 Importing 值的 samples 标准偏差。
$sum返回数值的总和。忽略非数字值。

变量表达式运算符

NameDescription
$let定义要在子表达式范围内使用的变量,并返回子表达式的结果。接受命名参数。


接受任意数量的参数表达式。

表达式运算符的字母 Sequences 列表

NameDescription
$abs返回数字的绝对值。
$add添加数字以返回总和,或者添加数字和日期以返回新日期。如果添加数字和日期,则将数字视为毫秒。接受任意数量的参数表达式,但最多只能一个表达式解析为日期。
$addToSet返回每个组的唯一表达式值的数组。数组元素的 Sequences 未定义。

仅在$group阶段可用。
如果集合的* no *元素的值为false,则返回$allElementsTrue返回true,否则返回false。接受单个参数表达式。
$and仅当其所有*表达式的计算结果为true时才返回true。接受任意数量的参数表达式。
如果集合中的* any *个元素的求值为true,则返回$anyElementTrue返回true;否则,返回false。接受单个参数表达式。
$arrayElemAt返回指定数组索引处的元素。
$arrayToObject将键值对数组转换为文档。
$avg返回数值的平均值。忽略非数字值。
在版本 3.2 中更改:在$group$project阶段均可用。
$ceil返回大于或等于指定数字的最小整数。
$cmp返回值:0如果两个值相等,则1如果第一个值大于第二个值,则-1如果第一个值小于第二个值。
$concat连接任意数量的字符串。
$concatArrays连接数组以返回连接的数组。
$cond三元运算符,它对一个表达式求值,并根据结果返回其他两个表达式之一的值。接受一个有序列表中的三个表达式或三个命名参数。
$dateFromParts根据日期的组成部分构造 BSON Date 对象。
$dateToParts返回包含日期组成部分的文档。
$dateFromString返回日期/时间作为日期对象。
$dateToString以带格式的字符串返回日期。
$dayOfMonth以 1 到 31 之间的数字返回日期的月份。
$dayOfWeek返回日期的星期几,其范围为 1(星期日)至 7(星期六)之间的数字。
$dayOfYear返回日期中的一年中的日期,范围为 1 到 366((年)之间的数字。
$divide返回将第一个数字除以第二个数字的结果。接受两个参数表达式。
$eq如果值相等则返回true
$exp将* e *提高到指定的指数。
$filter选择数组的子集以返回仅包含与过滤条件匹配的元素的数组。
$first从第一个文档为每个组返回一个值。仅当文档按定义的 Sequences 定义 Sequences。
仅在$group阶段可用。
$floor返回小于或等于指定数字的最大整数。
$gt如果第一个值大于第二个值,则返回true
$gte如果第一个值大于或等于第二个值,则返回true
$hour以 0 到 23 之间的数字返回日期的小时。
$ifNull如果第一个表达式的结果为空,则返回第一个表达式的非空结果或第二个表达式的结果。空结果包含未定义值或缺少字段的实例。接受两个表达式作为参数。第二个表达式的结果可以为 null。
$in返回一个布尔值,指示指定的值是否在数组中。
$indexOfArray在数组中搜索指定值的出现,并返回第一次出现的数组索引。如果未找到子字符串,则返回-1
$indexOfBytes在字符串中搜索子字符串的出现,并返回第一次出现的 UTF-8 字节索引。如果未找到子字符串,则返回-1
$indexOfCP在字符串中搜索子字符串的出现,并返回第一次出现的 UTF-8 代码点索引。如果未找到子字符串,则返回-1
$isArray确定操作数是否为数组。返回一个布尔值。
$isoDayOfWeek以 ISO 8601 格式返回工作日编号,范围从1(对于星期一)到7(对于星期日)。
$isoWeek以 ISO 8601 格式返回星期数,范围从153。周号从1开始,其中包含该年的第一个星期四的周(周一至周日)。
$isoWeekYear以 ISO 8601 格式返回年份。年份从第 1 周的星期一(ISO 8601)开始,到最后一周的星期日(ISO 8601)结束。
$last从每个组的最后一个文档返回一个值。仅当文档按定义的 Sequences 定义 Sequences。
仅在$group阶段可用。
$let定义要在子表达式范围内使用的变量,并返回子表达式的结果。接受命名参数。
接受任意数量的参数表达式。
$literal不解析就返回一个值。用于聚合管道可以解释为表达式的值。例如,对以$开头的字符串使用$literal表达式,以避免将其解析为字段路径。
$ln计算数字的自然对数。
$log计算指定底数中的数字的对数。
$log10计算数字的对数以 10 为底。
$lt如果第一个值小于第二个值,则返回true
$lte如果第一个值小于或等于第二个,则返回true
$map对数组的每个元素应用子表达式,并按 Sequences 返回结果值的数组。接受命名参数。
$max返回每个组的最高表达值。
在版本 3.2 中更改:在$group$project阶段均可用。
$mergeObjects将多个文档合并为一个文档。
$meta访问文本搜索元数据。
$min返回每个组的最低表达值。
在版本 3.2 中更改:在$group$project阶段均可用。
$millisecond以 0 到 999 之间的数字返回日期的毫秒数。
$minute以 0 到 59 之间的数字返回日期的分钟。
$mod返回第一个数字的余数除以第二个数字。接受两个参数表达式。
$month以 1(一月)至 12(十二月)之间的数字返回日期的月份。
$multiply乘以数字可返回乘积。接受任意数量的参数表达式。
$ne如果值不是*等价的,则返回true
$not返回与其参数表达式相反的布尔值。接受单个参数表达式。
$objectToArray将文档转换为代表键值对的文档数组。
$or如果**的任何表达式的值为true,则返回true。接受任意数量的参数表达式。
$pow将数字增加到指定的指数。
$push返回每个组的表达式值数组。
仅在$group阶段可用。
$range根据用户定义的 Importing 输出包含整数序列的数组。
$reduce将表达式应用于数组中的每个元素,并将它们组合为单个值。
$reverseArray返回具有相反 Sequences 元素的数组。
$second将日期的秒数返回为 0 到 60 之间的数字(ap 秒)。
$setDifference返回具有出现在第一个集合中但不出现在第二个集合中的元素的集合;即相对于第一组执行第二组的relative complement。正好接受两个参数表达式。
如果 Importing 集具有相同的不同元素,则$setEquals返回true。接受两个或多个参数表达式。
$setIntersection返回具有出现在全部Importing 集中的元素的集合。接受任意数量的参数表达式。
$setIsSubset如果第一组的所有元素都出现在第二组中(包括第一组等于第二组时),则返回true;即不是strict subset。正好接受两个参数表达式。
$setUnion返回一个集合,该集合包含出现在任何Importing 集中的元素。
$size返回数组中的元素数。接受单个表达式作为参数。
$slice返回数组的子集。
$split根据定界符将字符串拆分为子字符串。返回子字符串数组。如果在字符串中找不到分隔符,则返回包含原始字符串的数组。
$sqrt计算平方根。
$stdDevPop返回 Importing 值的总体标准偏差。
在版本 3.2 中更改:在$group$project阶段均可用。
$stdDevSamp返回 Importing 值的 samples 标准偏差。
在版本 3.2 中更改:在$group$project阶段均可用。
$strcasecmp执行不区分大小写的字符串比较并返回:0如果两个字符串相等,则1如果第一个字符串大于第二个字符串,则-1如果第一个字符串小于第二个字符串。
$strLenBytes返回字符串中 UTF-8 编码的字节数。
$strLenCP返回字符串中的 UTF-8 code points的数量。
$substr已弃用。使用$substrBytes$substrCP
$substrBytes返回字符串的子字符串。从字符串中指定的 UTF-8 字节索引(从零开始)处的字符开始,并 continue 指定的字节数。
$substrCP返回字符串的子字符串。从字符串中指定的 UTF-8 代码点(CP)索引(从零开始)处的字符开始,并 continue 指定的代码点数。
$subtract返回从第一个值减去第二个值的结果。如果两个值是数字,则返回差值。如果两个值是日期,则以毫秒为单位返回差值。如果两个值分别是日期和以毫秒为单位的数字,则返回结果日期。接受两个参数表达式。如果两个值是日期和数字,请首先指定 date 参数,因为从数字中减去日期没有意义。
$sum返回数值之和。忽略非数字值。
在版本 3.2 中更改:在$group$project阶段均可用。
$switch评估一系列案例表达式。当它找到一个计算结果为true的表达式时,$switch执行指定的表达式并退出控制流程。
$toLower将字符串转换为小写。接受单个参数表达式。
$toUpper将字符串转换为大写。接受单个参数表达式。
$trunc将数字截断为其整数。
$type返回该字段的 BSON 数据类型。
$week将日期的星期数返回为 0(一年中的第一个星期日之前的部分星期)和 53(le 年)之间的数字。
$year以数字形式返回日期的年份(例如 2014)。
$zip将两个数组合并在一起。

有关管道阶段,请参见聚合管道阶段