注意
有关特定运算符的详细信息,包括语法和示例,请单击特定运算符以转到其参考页。
db.collection.aggregate
)¶在该db.collection.aggregate
方法中,流水线级出现在数组中。文档依次经过各个阶段。所有的以外$out
,$merge
和$geoNear
阶段可以在管道中出现多次。
阶段 | 描述 |
---|---|
$addFields |
将新字段添加到文档。与相似
|
$bucket |
根据指定的表达式和存储区边界将传入文档分类为多个组,称为存储区。 |
$bucketAuto |
根据指定的表达式将传入文档分类为特定数量的组,称为存储桶。自动确定存储区边界,以尝试将文档平均分配到指定数量的存储区中。 |
$collStats |
返回有关集合或视图的统计信息。 |
$count |
返回聚合管道此阶段的文档数计数。 |
$facet |
在同一阶段的同一组输入文档上处理多个聚合管道。支持在一个阶段中创建能够表征多维或多面数据的多面聚合。 |
$geoNear |
根据与地理空间点的接近程度返回有序的文档流。包含
$match ,$sort 和$limit 用于地理空间数据的功能。输出文档包括附加距离字段,并且可以包括位置标识符字段。 |
$graphLookup |
对集合执行递归搜索。向每个输出文档添加一个新的数组字段,其中包含对该文档的递归搜索的遍历结果。 |
$group |
按指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。消耗所有输入文档,并在每个不同的组中输出一个文档。输出文档仅包含标识符字段,如果指定,还包含累积字段。 |
$indexStats |
返回有关集合每个索引使用情况的统计信息。 |
$limit |
将未修改的前n个文档传递到管道,其中n是指定的限制。对于每个输入文档,输出一个文档(对于前n个文档)或零文档(在前n个文档之后)。 |
$listSessions |
列出所有活动时间已经足够长以传播到system.sessions 集合的会话。 |
$lookup |
对同一数据库中的另一个集合执行左外部 联接,以过滤“联接”集合中的文档以进行处理。 |
$match |
筛选文档流,以仅允许匹配的文档未经修改地传递到下一个管道阶段。
$match 使用标准的MongoDB查询。对于每个输入文档,输出一个文档(匹配)或零文档(不匹配)。 |
$merge |
将聚合管道的结果文档写入集合。该阶段可以将结果合并(插入新文档,合并文档,替换文档,保留现有文档,使操作失败,使用自定义更新管道处理文档)将结果合并到输出集合中。要使用该 4.2版中的新功能。 |
$out |
将聚合管道的结果文档写入集合。要使用该$out 阶段,它必须是管道中的最后一个阶段。 |
$planCacheStats |
返回集合的计划缓存信息。 |
$project |
重塑流中的每个文档,例如通过添加新字段或删除现有字段。对于每个输入文档,输出一个文档。 另请参阅 |
$redact |
通过基于文档本身中存储的信息限制每个文档的内容,来重塑流中的每个文档。包含$project 和的功能
$match 。可用于实施字段级修订。对于每个输入文档,输出一个或零个文档。 |
$replaceRoot |
用指定的嵌入式文档替换文档。该操作将替换输入文档中的所有现有字段,包括该
|
$replaceWith |
用指定的嵌入式文档替换文档。该操作将替换输入文档中的所有现有字段,包括该
|
$sample |
从其输入中随机选择指定数量的文档。 |
$set |
将新字段添加到文档。与相似
|
$skip |
跳过前n个文档,其中n是指定的跳过编号,并将其余未修改的文档传递到管道。对于每个输入文档,输出零个文档(对于前n个文档)或一个文档(如果在前n个文档之后)。 |
$sort |
通过指定的排序键对文档流重新排序。只有顺序改变;这些文档保持不变。对于每个输入文档,输出一个文档。 |
$sortByCount |
根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档数。 |
$unset |
从文档中删除/排除字段。 |
$unwind |
从输入文档中解构一个数组字段,以输出每个元素的文档。每个输出文档用元素值替换数组。对于每个输入文档,输出n个文档,其中n是数组元素的数量,对于空数组可以为零。 |
db.aggregate
)¶从3.6版开始,MongoDB还提供以下
db.aggregate
方法:
以下阶段使用db.aggregate()
方法而不是db.collection.aggregate()
方法。
阶段 | 描述 |
---|---|
$currentOp |
返回有关MongoDB部署的活动和/或休眠操作的信息。 |
$listLocalSessions |
列出当前在当前连接mongos 或mongod
实例上使用的所有活动会话。这些会话可能尚未传播到
system.sessions 集合。 |
从MongoDB 4.2开始,您可以使用聚合管道在以下位置进行更新:
命令 | mongo 壳方法 |
---|---|
findAndModify |
|
update |
对于更新,管道可以包括以下阶段:
$addFields
及其别名 $set
$project
及其别名 $unset
$replaceRoot
及其别名$replaceWith
。也可以看看
表达式可以包括字段路径, 文字,系统变量,表达式对象和表达式运算符。表达式可以嵌套。
聚合表达式使用字段路径访问输入文档中的字段。要指定字段路径,请在字段名或带
虚线的字段名(如果该字段在嵌入式文档中)之前加一个美元符号$
。例如,
"$user"
指定字段的字段路径user
或
"$user.name"
指定字段的字段路径"user.name"
。
"$<field>"
等效于"$$CURRENT.<field>"
,其中
CURRENT
是默认为当前对象根目录的系统变量,除非在特定阶段另有说明。
MongoDB提供了各种用于表达式的聚合系统变量。要访问变量,请在变量名称前添加$$
。例如:
变量 | 通过访问 $$ |
简要描述;简介 |
---|---|---|
NOW |
$$NOW |
返回当前日期时间值,该值在部署的所有成员之间相同,并且在整个聚合管道中保持不变。(在4.2+版本中可用) |
CLUSTER_TIME |
$$CLUSTER_TIME |
返回当前时间戳值,该值在部署的所有成员之间相同,并且在整个聚合管道中保持不变。仅适用于副本集和分片群集。(在4.2+版本中可用) |
ROOT |
$$ROOT |
引用根文档,即顶级文档。 |
CURRENT |
$$CURRENT |
引用字段路径的开始,默认情况下为,
ROOT 但可以更改。 |
REMOVE |
$$REMOVE |
允许有条件地排除字段。(在3.6+版本中可用) |
DESCEND |
$$DESCEND |
$redact 表达式的允许结果之一。 |
PRUNE |
$$PRUNE |
$redact 表达式的允许结果之一。 |
KEEP |
$$KEEP |
$redact 表达式的允许结果之一。 |
有关这些变量的更详细说明,请参见系统变量。
在这个部分
运算符表达式类似于带有参数的函数。通常,这些表达式采用参数数组并具有以下形式:
如果operator接受单个参数,则可以省略指定参数列表的外部数组:
为了避免在参数是文字数组的情况下解析歧义,必须将文字数组包装在$literal
表达式中,或者保留指定参数列表的外部数组。
算术表达式对数字执行数学运算。一些算术表达式也可以支持日期算术。
名称 | 描述 |
---|---|
$abs |
返回数字的绝对值。 |
$add |
添加数字以返回总和,或者添加数字和日期以返回新日期。如果添加数字和日期,则将数字视为毫秒。接受任意数量的参数表达式,但最多只能一个表达式解析为日期。 |
$ceil |
返回大于或等于指定数字的最小整数。 |
$divide |
返回第一个数字除以第二个数字的结果。接受两个参数表达式。 |
$exp |
将e提高到指定的指数。 |
$floor |
返回小于或等于指定数字的最大整数。 |
$ln |
计算数字的自然对数。 |
$log |
以指定的底数计算数字的对数。 |
$log10 |
计算数字的以10为底的对数。 |
$mod |
返回第一个数字的余数除以第二个数字。接受两个参数表达式。 |
$multiply |
乘以数字可返回乘积。接受任意数量的参数表达式。 |
$pow |
将数字提高到指定的指数。 |
$round |
将数字四舍五入为整数或指定的小数位。 |
$sqrt |
计算平方根。 |
$subtract |
返回从第一个值减去第二个值的结果。如果两个值是数字,则返回差值。如果两个值是日期,则返回以毫秒为单位的差。如果两个值是日期和毫秒数,则返回结果日期。接受两个参数表达式。如果两个值是日期和数字,请首先指定date参数,因为从数字中减去日期没有意义。 |
$trunc |
将数字截断为整数或指定的小数位。 |
$arrayElemAt |
返回指定数组索引处的元素。 |
---|---|
$arrayToObject |
将键值对数组转换为文档。 |
$concatArrays |
连接数组以返回连接的数组。 |
$filter |
选择数组的子集以返回仅包含与过滤条件匹配的元素的数组。 |
$in |
返回一个布尔值,指示指定的值是否在数组中。 |
$indexOfArray |
在数组中搜索指定值的出现,并返回第一次出现的数组索引。如果未找到子字符串,则返回-1 。 |
$isArray |
确定操作数是否为数组。返回一个布尔值。 |
$map |
对数组的每个元素应用子表达式,并按顺序返回结果值的数组。接受命名参数。 |
$objectToArray |
将文档转换为代表键值对的文档数组。 |
$range |
根据用户定义的输入输出包含整数序列的数组。 |
$reduce |
将表达式应用于数组中的每个元素,并将它们组合为单个值。 |
$reverseArray |
返回具有相反顺序元素的数组。 |
$size |
返回数组中元素的数量。接受单个表达式作为参数。 |
$slice |
返回数组的子集。 |
$zip |
将两个数组合并在一起。 |
布尔表达式将其参数表达式评估为布尔值,并返回布尔值作为结果。
除了false
布尔值,布尔表达式为false
如下:null
,0
,和undefined
的值。布尔表达式将所有其他值评估为true
,包括非零数字值和数组。
名称 | 描述 |
---|---|
$and |
true 仅当其所有表达式的计算结果
均为时才返回true 。接受任意数量的参数表达式。 |
$not |
返回与其参数表达式相反的布尔值。接受单个参数表达式。 |
$or |
true 当其任何表达式的计算结果为时,
返回true 。接受任意数量的参数表达式。 |