Mongo 聚合
聚合管道是一系列有序的指令,称为阶段。一个阶段的全部输出形成下一个阶段的全部输入,以此类推,没有副作用。管道表现出高度的可组合性,其中阶段是无状态的独立组件,以各种组合(管道)选择和组装以满足特定要求。
原则
- 在原型设计或调试时轻松禁用阶段子集
- 通过执行复制、粘贴和修改,轻松将新字段添加到阶段或管道中的新阶段,而不会遇到因添加元素之前缺少逗号等问题而导致的神秘错误消息
- 轻松了解每个不同阶段的目的,一目了然
指南
-
不要与另一个阶段在同一行开始或结束一个阶段
-
对于阶段中的每个字段和管道中的阶段,包括尾随逗号,即使它当前是最后一项
-
在每个阶段之间包含一个空换行符
-
对于复杂的阶段,包括
//在阶段前的换行符上的注释和解释 -
要在原型设计或调试另一个阶段时“禁用”管道的某些阶段,请使用多行注释
/*前缀和*/后缀
字段路径
以字符串形式访问,$前缀后跟正在处理的每条记录中的字段路径。例子:"$account.sortcode","$addresses.address.city"
变量
作为带有$$前缀后跟固定名称的字符串访问。
- **上下文系统变量。**对于来自系统环境而不是每个输入记录的值,聚合阶段正在处理。例子:
"$$NOW","$$CLUSTER_TIME" - **标记标志系统变量。**指示要传递回聚合运行时的所需行为。示例:
"$$ROOT","$$REMOVE","$$PRUNE" - **绑定用户变量。**为了存储您使用
$let运算符(或使用阶段let选项或阶段选项)声明的值。例子:$lookupas$map$filter"$$product_name_var""$$orderIdVal"
阶段指令
$addFields
向文稿添加新栏位。类似于$project,$addFields重塑流中的每个文档;具体而言,通过在输出包含输入文档和新添加字段的现有字段的输出文档中添加新字段。
$bucket
根据指定的表达式和存储桶边界,将传入的文档分类为组,称为存储桶。
$bucketAuto
根据指定的表达式将传入的文档分类为特定数量的组,称为存储桶。存储桶边界会自动确定,以尝试将文档均匀地分布到指定数量的存储桶中。
$changeStream
返回集合的更改流光标。这个阶段只能在聚合管道中发生一次,并且必须作为第一阶段发生。
$collStats
返回有关集合或视图的统计数据。
$count
返回聚合管道此阶段文档数量的计数。
$desify
在字段中缺少某些值的一系列文档中创建新文档。
$documents
从输入表达式返回文字文档。
$facet
在同一组输入文档的单个阶段内处理多个聚合管道。能够创建多方面的聚合,能够在单个阶段描述跨多个维度或跨方面的数据。
$fill
在文档中填充null和缺失的字段值。
$geoNear
根据距离地理空间点的距离返回有序的文档流。包含$match,$sort 以及 $limit 用于地理空间数据。输出文档包括一个额外的距离字段,并且可以包括一个位置标识符字段。
$graphLookup
对集合执行递归搜索。在每个输出文档中,添加一个新的数组字段,其中包含该文档递归搜索的遍历结果。
$group
分组通过指定的标识符表达式输入文档,如果指定,则将累加器表达式应用于每个组。消耗所有输入文档,并为每个不同的组输出一个文档。输出文档仅包含标识符字段,如果指定,则包含累计字段。
$indexStats
返回有关收集使用每个索引的统计数据。
$limit
将未经修改的前n 个文档传递给管道,其中n是指定的限制。对于每个输入文档,输出一个文档(前n 个文档)或零文档(前n 个文档之后)。
$listSessions
列出所有活跃时间足够长的会话,可以传播到system.sessions集合。
$lookup
在同一数据库中执行另一个集合的左侧外部连接,以过滤“joined”集合中的文档进行处理。
$match
过滤文档流,仅允许匹配的文档未经修改地传递到下一个管道阶段。$match 使用标准的 MongoDB 查询。对于每个输入文档,输出一个文档(匹配)或零文档(不匹配)。
$merge
将聚合管道的生成文档写入集合。该阶段可以将结果(插入新文档、合并文档、替换文档、保留现有文档、操作失败、使用自定义更新管道处理文档)将结果整合到输出集合中。要使用 $merge 阶段,这一定是管道中的最后一个阶段
$out
将聚合管道的生成文档写入集合。要使用 $out 阶段,这一定是管道中的最后一个阶段。
$planCacheStats
返回集合的计划缓存信息。
$proejct
重塑流中的每个文档,例如添加新字段或删除现有字段。对于每个输入文档,输出一个文档。当输出文档的所需结构与输入文档的结构有很大不同,不需要包含大部分原始字段时使用。主要构建新的数据结构。
$redact
通过根据文档本身存储的信息限制每个文档的内容来重塑流中的每个文档。包含 $project 和 $match。可用于实现字段级别编辑。对于每个输入文档,输出一个或零个文档。
$replaceRoot
将文档替换为指定的嵌入式文档。该操作替换了输入文档中的所有现有字段,包括_id字段。指定嵌入在输入文档中的文档,以将嵌入式文档提升到顶层。
$replaceWith
将文档替换为指定的嵌入式文档。该操作替换了输入文档中的所有现有字段,包括_id字段。指定嵌入在输入文档中的文档,以将嵌入式文档提升到顶层。
$sample
从其输入中随机选择指定数量的文档。
$set
向文稿添加新栏位。类似于 $project,$set 重塑流中的每个文档;具体而言,通过在输出包含输入文档和新添加字段的现有字段的输出文档中添加新字段。需要保留输入记录中的大部分字段,并且想要添加、修改或删除少数字段子集时使用。
$setWindowFields
将文档分组到窗口中,并将一个或多个运算符应用于每个窗口中的文档。
$skip
跳过前n 个文档,其中n是指定的跳过编号,并将未修改的剩余文档传递给管道。对于每个输入文档,输出零文档(对于前n 个文档)或一个文档(如果在前n 个文档之后)。
$sort
通过指定的排序键对文档流进行重新排序。只有订单更改;文件保持不变。对于每个输入文档,输出一个文档。
$sortByCount
根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档计数。
$unionWith
执行两个集合的联合;即将两个集合的管道结果合并到一个单一结果集中。
$unset
从文稿中删除/排除字段。$unset 是 $project 删除字段的阶段。
$unwind
从输入文档中解构数组字段,为每个元素输出文档。每个输出文档都用元素值替换数组。对于每个输入文档,输出n个文档,其中n是数组元素的数量,空数组可以为零。
运算指令
算术表达运算符
$abs
返回数字的绝对值。
$add
添加数字以返回总和,或添加数字和日期以返回新日期。如果添加数字和日期,请将数字视为毫秒。接受任意数量的参数表达式,但最多一个表达式可以解析为日期。
$ceil
返回大于或等于指定数字的最小整数。
$divide
返回将第一个数字除以第二个数字的结果。接受两个参数表达式。
$exp
将e提高到指定的指数。
$floor
返回小于或等于指定数字的最大整数。
$ln
计算数字的自然对数。
$log
计算指定基数中的数字的日志。
$log10
计算数字的对数基数 10。
$mod
返回第一个数字的剩余部分除以第二个数字。接受两个参数表达式。
$multipy
乘以数字以返回给字段。接受任意数量的参数表达式。
1
{ "$multiply": ["$price", 0.9] }
$pow
将数字提高到指定的指数。
$round
将数字四舍五入到整个整数或指定的小数位。
$sqrt
计算平方根。
$subtract
返回从第一个值中减去第二个值的结果。如果这两个值是数字,则返回差额。如果这两个值是日期,则返回以毫秒为单位的差值。如果这两个值是日期和数字(以毫秒为单位),则返回结果日期。接受两个论点表达式。如果这两个值是日期和数字,请先指定日期参数,因为从数字中减去日期没有意义。
$trunc
截断数字到整个整数或指定的小数位。
数组表达运算符
$arrayElemAt
在指定的数组索引处返回元素。
$arrayToObject
将键值对数组转换为文档。
$concatArrays
连接数组以返回串联数组。
$filter
选择数组的一个子集以返回仅包含与筛选条件匹配的元素的数组。
$first
返回第一个数组元素。区别于 $first 累加器。
$firstN
从数组的开头返回指定数量的元素。区别于 $firstN 累加器。
$in
返回一个布尔值,指示指定值是否在数组中。
$indexOfArray
在数组中搜索指定值的出现,并返回第一次出现的数组索引。如果没有找到子字符串,则返回-1。
$isArray
确定操作数是否为数组。返回一个布尔值。
$last
返回最后一个数组元素。区别于 $last 累加器。
$lastN
从数组末尾返回指定数量的元素。区别于 $lastN 累加器。
$map
将子表达式应用于数组的每个元素,并按顺序返回结果值的数组。接受命名参数。
1
2
3
4
5
6
7
{
"$map": {
"input": "$products",
"as": "product",
"in": { "$toUpper": "$$product" }
}
}
$maxN
返回数组中 n 最大值。区别于 $maxN 累加器。
$minN
返回数组中的 n 最小值。区别于 $minN累加器。
$objectToArray
将文档转换为表示键值对的文档数组。
$range
根据用户定义的输入输出包含整数序列的数组。
$reduce
将表达式应用于数组中的每个元素,并将其组合成单个值。
1
2
3
4
5
6
7
8
9
{
"$reduce": {
"input": "$products",
"initialValue": "",
"in": {
"$concat": ["$$value", "$$this", "; "]
}
}
}
$reverseArray
返回一个数组,元素按相反顺序排列。
$size
返回数组中的元素数量。接受单个表达式作为参数。
$slice
返回数组的子集。
$sortArray
对数组的元素进行排序。
$zip
将两个数组合并在一起。
布尔表达式运算符
$and
仅当其所有表达式的计算结果为 true 时才返回 true。接受任意数量的参数表达式。
$not
返回与其参数表达式相反的布尔值。接受单个参数表达式。
$or
当其任何表达式的计算结果为 true 时返回 true。接受任意数量的参数表达式。
比较表达式运算符
$cmp
如果两个值等价,则返回 0,如果第一个值大于第二个值,则返回 1,如果第一个值小于第二个值,则返回-1。
$eq
如果值等效,则返回 true。
$gt
如果第一个值大于第二个值,则返回 true。
$gte
如果第一个值大于或等于第二个值,则返回 true。
$lt
如果第一个值小于第二个值,则返回 true。
$lte
如果第一个值小于或等于第二个值,则返回 true。
$ne
如果值不等效,则返回 true。
条件表达式运算符
$cond
计算一个表达式的三元运算符,并根据结果返回其他两个表达式之一的值。接受有序列表中的三个表达式或三个命名参数。
$ifNull
如果第一个表达式导致空结果,则返回第一个表达式的非空结果或第二个表达式的结果。空结果包括未定义值或缺失字段的实例。接受两个表达式作为参数。第二个表达式的结果可以为空。
$switch
评估一系列大小写表达式。当它找到一个计算为 true 的表达式时,$switch 会执行指定的表达式并突破控制流。