关于aggregation 语法和表达式大全(最新3.4版)
用mongodb四年多了,从1.8版用到目前的3.4版,功能越来越强大,而且它的每一次升级带给我的都是惊喜,最近发现他的aggregation(管道)技术越来越丰富了,基本上将它提供的所有功能都集成了,故从官网上将aggregation这一页的操作阶段和表达式等进行了简单的翻译,以便一眼能直观的看出每个命令的功能,也算是自已对学习的知识进行一整理。mongodb在为aggregation提供的这些命令中,可谓算是开发了一种新语言出来了,因为语言的一些基本语法都算是有了,只是还有点简单罢了,mongodb公司还会不断的完善中。以下是从官网扒过来并进行简单翻译的命令操作符。
管道操作的各种阶段
阶段名 | 介绍 |
$collStats | 返回表状态 |
$project | 重新构造表的结构,比如删除或增加字段,每个输入文档对应一个输出文档 |
$match | 过滤文档流,将匹配到的文档未修改的传递到下一个阶段。$match操作使用标准的MongoDB查询。对于每个输入文档,输出一个文档(匹配)或者零个文档(未匹配) |
$redact | 通过基于存储在文档本身中的信息限制每个文档的内容,重新构造流中的每个文档。 包含$project和$match的功能。 可以用来实现字段级修饰。 对于每个输入文档,输出一个或零个文档。 |
$limit | 将未修改的前n个文档传递到管道,其中n是指定的限制。 对于每个输入文档,输出一个文档(对于前n个文档)或零文档(在前n个文档之后)。 |
$skip | 跳过前n个文档,其中n是指定的跳过数,并将未修改的其余文档传递到管道。 对于每个输入文档,输出零文档(对于前n个文档)或一个文档(如果在第一个文档之后)。 |
$unwind | 从输入文档解构数组字段,以输出用于eachelement的文档。 每个输出文档都用元素值替换数组。 对于每个输入文档,输出n个文档,其中n是数组元素的数量,对于空数组可以为零。 |
$group | 对指定的标识符表达式输入文档进行分组,并将累加器表达式(如果指定)应用于每个分组。使用所有输入文档,并为每个不同的组输出一个文档。 输出文档仅包含标识符字段,如果指定,则包含累积字段。 |
$sample | 从其输入中随机选择指定数量的文档。 |
$sort | 通过指定的排序键重新排序文档。 只有文档顺序改变; 文件保持不变。 对于每个输入文档,输出一个文档。 |
$geoNear | 根据与地理空间点的接近度返回有序文档。 结合地理空间数据的$match,$sort和$limit的功能。 输出文档包括附加距离字段,并且可以包括位置标识符字段。 |
$lookup | 对同一数据库中的另一个集合执行left outer join,以过滤来自“joined”集合的文档以进行处理。 |
$out | 将聚合管道的结果文档写入集合。 要使用$out阶段,它必须是管道中的最后一个阶段。 |
$indexStats | 返回有关集合的每个索引的使用的统计信息。 |
$facet | 在同一组输入文档的单个阶段中处理多个聚合管道。 允许创建能够在单个阶段中跨多个维或面的表征数据的多面聚合。 |
$bucket | 根据指定的表达式和存储桶边界将传入文档归入组(称为存储桶)。 |
$bucketAuto | 根据指定的表达式将传入文档归入特定数量的组(称为存储桶)。 将自动确定存储桶边界,以尝试将文档均匀分布到指定数量的存储桶中。 |
$sortByCount | 根据指定表达式的值对传入文档进行分组,然后计算每个不同组中的文档计数。$sortByCount阶段等同于$group + $sort序列。 |
$addFields | 向文档添加新字段。 输出包含输入文档和新添加字段中所有现有字段的文档。 |
$replaceRoot | 用指定的嵌入文档替换文档。 操作将替换输入文档中的所有现有字段,包括_id字段。 指定嵌入在输入文档中的文档,以将嵌入的文档提升到顶级。 |
$count | 返回聚合管道此阶段文档数的计数。 |
$graphLookup | 对集合执行递归搜索。 对每个输出文档,添加一个新的数组字段,其中包含该文档的递归搜索的遍历结果。 |
表达式
布尔表达式
表达式名 | 介绍 |
$and | 仅当其所有表达式计算结果为true时,才返回true。 接受任意数量的参数表达式。 |
$or | 当其任何一表达式求值为true时返回true。 接受任意数量的参数表达式。 |
$not | 返回与其参数表达式相反的布尔值。 接受单个参数表达式。 |
设置表达式
表达式名 | 介绍 |
$setEquals | 如果多个不同的输入中集具有相同的元素,则返回true。 接受两个或多个参数表达式。 |
$setIntersection | 返回具有出现在所有输入集中的元素的集合。 接受任意数量的参数表达式。(取交集) |
$setUnion | 返回具有出现在任何输入集中的元素的集合。 接受任意数量的参数表达式。(取并集) |
$setDifference | 返回一个包含出现在第一个集合中但不在第二个集合中的元素的集合; 即执行第二组相对于第一组的相对互补。 只接受两个参数表达式。 |
$setIsSubset | 如果第一个集合的所有元素都出现在第二个集合中,则返回true,包括第一个集合等于第二个集合; 即不是严格的子集。 只接受两个参数表达式。 |
$anyElementTrue | 如果集合的任何元素求值为true,则返回true; 否则返回false。 接受单个参数表达式。 |
$allElementsTrue | 如果集合的任何元素都不为false,则返回true,否则返回false。 接受单个参数表达式。 |
比较表达式
表达式名 | 介绍 |
$cmp | 返回:如果两个值相等,则为0;如果第一个值大于第二个值,则返回1;如果第一个值小于第二个值,返回-1。 |
$eq | 如果值是相等,则返回true。 |
$gt | 如果第一个值大于第二个值,则返回true。 |
$gte | 如果第一个值大于或等于第二个值,则返回true。 |
$lt | 如果第一个值小于第二个值,则返回true。 |
$lte | 如果第一个值小于或等于第二个值,则返回true。 |
$ne | 如果值不相等,则返回true。 |
算术表达式
表达式名 | 介绍 |
$abs | 返回数字的绝对值。 |
$add | 添加数字以返回总和,或者添加数字和返回新日期的日期。 如果添加数字和日期,则将数字视为毫秒。 接受任意数量的参数表达式,但最多只有一个表达式可以解析为日期。 |
$ceil | 返回大于或等于指定数字的最小整数。 |
$divide | 返回将第一个数除以第二个数的结果。 接受两个参数表达式。 |
$exp | 将e指定为指定的指数。 |
$floor | 返回小于或等于指定数字的最大整数。 |
$ln | 计算数字的自然对数。 |
$log | 计算指定基数中的数字的对数。 |
$log10 | 计算基数为10的对数。 |
$mod | 返回第一个数除以第二个数的余数。 接受两个参数表达式。 |
$multiply | 返回多个数相乘的结果。 接受任意数量的参数表达式。 |
$pow | 将数字增加到指定的指数。 |
$sqrt | 计算平方根。 |
$subtract | 返回从第一个值减去第二个值的结果。 如果两个值是数字,则返回差值。 如果两个值都是日期,则返回以毫秒为单位的差值。 如果两个值是日期和以毫秒为单位的数字,则返回生成的日期。 接受两个参数表达式。 如果两个值是日期和数字,请先指定日期参数,因为从数字中减去日期无意义。 |
$trunc | 将数字截断为其整数。 |
字符表达式
表达式名 | 介绍 |
$concat | 连接任意数量的字符串。 |
$indexOfBytes | 搜索字符串以查找子字符串的出现,并返回第一个出现的UTF-8字节索引。 找不到子串,返回-1。 |
$indexOfCP | 搜索字符串以查找子串的出现,并返回第一个出现的UTF-8代码点索引。 找不到子串,返回-1。 |
$split | 基于分隔符将字符串拆分为子字符串。 返回一个子串数组。 如果在字符串中未找到定界符,则返回包含原始字符串的数组。 |
$strcasecmp | 执行不区分大小写的字符串比较,并返回:如果两个字符串相等,则返回0,如果第一个字符串大于第二个,则返回1,如果第一个字符串小于第二个,则返回-1。 |
$strLenBytes | 返回字符串中UTF-8编码字节的数目。 |
$strLenCP | 返回字符串中UTF-8代码点的数量。 |
$substr | 已弃用。 使用$ substrBytes或$ substrCP。 |
$substrBytes | 返回字符串的子字符串。 以字符串中指定的UTF-8字节索引(从零开始)开始,并继续指定的字节数。 |
$substrCP | 返回字符串的子字符串。 以字符串中指定的UTF-8代码点(CP)索引(从零开始)开始,并继续指定的代码点数。 |
$toLower | 将字符串转换为小写。 接受单个参数表达式。 |
$toUpper | 将字符串转换为大写。 接受单个参数表达式。 |
文本搜索表达式
表达式名 | 介绍 |
$meta | 访问文本搜索元数据。 |
数组表达式
表达式名 | 介绍 |
$arrayElemAt | 返回指定数组索引处的元素。 |
$concatArrays | 连接数组并返回 |
$filter | 选择数组的子集以返回只包含与过滤条件匹配的元素的数组。 |
$indexOfArray | 搜索数组以获取指定值的出现,并返回第一个出现的数组索引。 找不到子串,返回-1。 |
$isArray | 确定操作数是否为数组。 返回布尔值。 |
$range | 根据用户定义的输入输出包含整数序列的数组。 |
$reverseArray | 返回具有相反顺序的元素的数组。 |
$reduce | 将表达式应用于数组中的每个元素,并将它们组合为单个值。 |
$size | 返回数组中元素的数量。 接受单个表达式作为参数。 |
$slice | 返回数组的子集。 |
$zip | 将两个列表合并在一起。 |
$in | 返回一个布尔值,表示指定的值是否在数组中。 |
变量表达式
文字表达式
表达式名 | 介绍 |
$literal | 返回值而不进行解析。 用于聚合管道可能解释为表达式的值。 例如,对以$开头的字符串使用$literal表达式,以避免作为字段路径进行解析。 |
数据类型表达式
表达式名 | 介绍 |
$type | 返回字段的BSON数据类型。 |
日期表达式
表达式名 | 介绍 |
$dayOfYear | 以1到366(闰年)之间的数字形式返回日期的年中某一天的日期。 |
$dayOfMonth | 以1到31之间的数字形式返回日期的月份中的某一天。 |
$dayOfWeek | 以1(星期日)和7(星期六)之间的数字形式返回日期的星期几。 |
$year | 返回日期作为数字的年份(例如2014)。 |
$month | 返回1(1月)和12(12月)之间的日期的月份。 |
$week | 将日期的周编号返回为0(该年的第一个星期日之前的部分周)和53(闰年)之间的数字。 |
$hour | 将日期的小时数返回为0到23之间的数字。 |
$minute | 将日期的分钟返回为介于0和59之间的数字。 |
$second | 将日期的秒数返回为0到60(闰秒)之间的数字。 |
$millisecond | 以0到999之间的数字形式返回日期的毫秒数。 |
$dateToString | 以格式化的字符串形式返回日期。 |
$isoDayOfWeek | 返回ISO 8601格式的工作日数字,范围从1(周一)到7(周日)。 |
$isoWeek | 以ISO 8601格式返回周数,范围从1到53.周数以1开始,包含年份第一个星期四的周(周一到周日)。 |
$isoWeekYear | 返回ISO 8601格式的年份。 年份从第1周(ISO 8601)的星期一开始,到最后一周的星期日(ISO 8601)结束。 |
条件表达式
表达式名 | 介绍 |
$cond | 三元运算符计算一个表达式,并根据结果返回其他两个表达式之一的值。 在有序列表或三个命名参数中接受三个表达式。 |
$ifNull | 如果第一个表达式导致空结果,则返回第一个表达式的非空结果或第二个表达式的结果。 空结果包含未定义值或缺少字段的实例。 接受两个表达式作为参数。 第二个表达式的结果可以为null。 |
$switch | 评估一系列的案例表达式。 当它找到一个计算结果为true的表达式时,$ switch将执行一个指定的表达式并跳出控制流。 |
累加器
表达式名 | 介绍 |
$sum | 返回数值总和。 忽略非数字值。 |
在版本3.2中更改:在$group和$project阶段都可用。 | |
$avg | 返回数值的平均值。 忽略非数字值。 |
在版本3.2中更改:在$group和$project阶段都可用。 | |
$first | 从每个组的第一个文档返回一个值。 仅当文档以定义的顺序定义时才定义顺序。 |
仅在$group阶段中可用。 | |
$last | 从每个组的最后一个文档返回一个值。 仅当文档以定义的顺序定义时才定义顺序。 |
仅在$group阶段中可用。 | |
$max | 返回每个组的最高表达式值。 |
在版本3.2中更改:在$group和$project阶段都可用。 | |
$min | 返回每个组的最小表达式值。 |
在版本3.2中更改:在$group和$project阶段都可用。 | |
$push | 返回每个组的表达式值数组。 |
仅在$group阶段中可用。 | |
$addToSet | 返回每个组的唯一表达式值的数组。 数组元素的顺序未定义。 |
仅在$group阶段中可用。 | |
$stdDevPop | 返回输入值的总体标准差。 |
在版本3.2中更改:在$group和$project阶段都可用。 | |
$stdDevSamp | 返回输入值的样本标准偏差。 |
在版本3.2中更改:在$group和$project阶段都可用。 |