介绍
本文档仅作为学习记录。
聚合操作
| 名称 | 描述 | 备注 |
|---|
| addFields | 添加新字段到输出的记录 | 等同于同时指定了所有已有字段和新增字段的 project 阶段 |
| project | 把指定的字段传递给下一个流水线,指定的字段可以是某个已经存在的字段,也可以是计算出来的新字段。 | |
| bucket | 将输入记录根据给定的条件和边界划分成不同的组,每组即一个 bucket | 将某个字段按照边界分组 |
| bucketAuto | 作用同bucket类似,只是无需指定 boundaries,bucketAuto。自动将记录平均分散到每组中。 | 包含一个以包含组中最大值和最小值两个字段的对象为值的 _id 字段和一个以组中记录数为值的 count 字段 |
| count | 计算上一聚合阶段输入到本阶段的记录数,输出一个记录,其中指定字段的值为记录数 | count 阶段等同于 group + project 的操作 |
| geoNear | 将记录按照离给定点从近到远输出 | geoNear 必须为第一个聚合阶段 |
| group | 将输入记录按给定表达式分组,输出时每个记录代表一个分组,每个记录的 _id 是区分不同组的 key。 | |
| limit | 限制输出到下一阶段的记录数。 | |
| lookup | 联表查询。 | |
| match | 据条件过滤文档,并且把符合条件的文档传递给下一个流水线阶段 | |
| replaceRoot | 指定一个已有字段作为输出的根节点,也可以指定一个计算出的新字段作为根节点 | |
| sample | 随机从文档中选取指定数量的记录。 | 随机获取数据库中一定数量的记录 |
| skip | 指定一个正整数,跳过对应数量的文档,输出剩下的文档 | |
| sort | 根据指定的字段,对输入的文档进行排序 | 1 代表升序排列(从小到大)-1 代表降序排列(从大到小) |
| sortByCount | 根据传入的表达式,将传入的集合进行分组(group)。然后计算不同组的数量,并且将这些组按照它们的数量进行排序,返回排序后的结果 | 表达式的形式是:$ + 指定字段。请注意:不要漏写 $ 符号。 |
| Unwind | 使用指定的数组字段中的每个元素,对文档进行拆分。拆分后,文档会从一个变为一个或多个,分别对应数组的每个元素 | |
| End | 标志聚合操作定义完成,发起实际聚合操作 | |
Command
数据库操作符,通过 db.command 获取
查询 & 逻辑操作符
| 名称 | 描述 | 备注 |
|---|
| and | 用于表示逻辑 "与" 的关系,表示需同时满足多个查询筛选条件 | expressions: any[] |
| or | 用于表示逻辑 "或" 的关系,表示需同时满足多个查询筛选条件 | 可跨字段查询 |
| not | 用于表示逻辑 "非" 的关系,表示需不满足指定的条件 | |
| nor | 用于表示逻辑 "都不" 的关系,表示需不满足指定的所有条件 | |
查询 & 比较操作符
| 名称 | 描述 | 备注 |
|---|
| eq | 查询筛选条件,表示字段等于某个值。eq 指令比对象的方式有更大的灵活性 | 可以是 number, boolean, string, object, array, Date |
| neq | 表示字段不等于某个值。表示字段不等于某个值,和 eq 相反 | |
| lt | 表示需小于指定值。 | 可以传入 Date 对象用于进行日期比较 |
| lte | 表示需小于或等于指定值 | |
| gt | 表示需大于指定值 | |
| gte | 表示需大于或等于指定值 | 可以传入 Date 对象用于进行日期比较 |
| in | 表示要求值在给定的数组内 | value: any[] |
| nin | 表示要求值不在给定的数组内 | 找出进度不是 0 或 100 的 todo; _.nin([0, 100]) |
查询 & 字段操作符
| 名称 | 描述 | 备注 |
|---|
| exists | 判断字段是否存在 | value: boolean |
| mod | 给定除数 divisor 和余数 remainder,要求字段作为被除数时 value % divisor = remainder | 参数:divisor: number ,remainder: number |
查询 & 数组操作符
| 名称 | 描述 | 备注 |
|---|
| all | 用于数组字段的查询筛选条件,要求数组字段中包含给定数组的所有元素 | in操作符适用于比较,all是用于数组 |
| elemMatch | 用于数组字段的查询筛选条件,要求数组中包含至少一个满足 elemMatch 给定的所有条件的元素 | 普通匹配,则仅需满足查询条件中的一个字段仅可。查看详情 |
| size | 用于数组字段的查询筛选条件,要求数组长度为给定值 | |
查询 & 表达式操作符
| 名称 | 描述 | 备注 |
|---|
| expr | 用于在查询语句中使用聚合表达式,方法接收一个参数,该参数必须为聚合表达式; | 查看详情 |
expr 可用于在聚合 match 流水线阶段中引入聚合表达式
- 如果聚合
match 阶段是在 lookup 阶段内,此时的 expr 表达式内可使用 lookup 中使用 let 参数定义的变量,具体示例可见 lookup 的 指定多个连接条件 例子
expr 可用在普通查询语句(where)中引入聚合表达式
更新 & 字段操作符
| 名称 | 描述 | 备注 |
|---|
| set | 更新操作符,用于设定字段等于指定值 | 这种方法相比传入纯 JS 对象的好处是能够指定字段等于一个对象 |
| remove | 用于表示删除某个字段 | |
| inc | 原子操作,用于指示字段自增 | 自增量,可正可负 |
| mul | 原子操作,用于指示字段自乘某个值 | 自乘量,可正可负 |
| min | 给定一个值,只有该值小于字段当前值才进行更新 | |
| max | 给定一个值,只有该值大于字段当前值才进行更新 | |
| rename | 字段重命名。如果需要对嵌套深层的字段做重命名,需要用点路径表示法。不能对嵌套在数组里的对象的字段进行重命名 | |
更新 & 数组操作符
| 名称 | 描述 | 备注 |
|---|
| push | 对一个值为数组的字段,往数组添加一个或多个值。或字段原为空,则创建该字段并设数组为传入值 | 可对插入后的数组进行排序,节选,查看详情 |
| pop | 对一个值为数组的字段,将数组尾部元素删除 | |
| unshift | 对一个值为数组的字段,往数组头部添加一个或多个值。或字段原为空,则创建该字段并设数组为传入值 | |
| shift | 对一个值为数组的字段,将数组头部元素删除 | |
| pull | 给定一个值或一个查询条件,将数组中所有匹配给定值或查询条件的元素都移除掉 | 可搭配用 elemMatch 查询条件,匹配嵌套在对象数组里面的对象 |
| pullAll | 给定一个值或一个查询条件,将数组中所有匹配给定值的元素都移除掉。跟 pull 的差别在于只能指定常量值、传入的是数组 | 区别:_.pull(_.in(['database', 'cloud'])). vs _.pullAll(['database', 'cloud'])` |
| addToSet | 原子操作。给定一个或多个元素,除非数组中已存在该元素,否则添加进数组。 | |
聚合操作符 $
数据库聚合操作符,通过 db.command.aggregate 获取
算数操作符
| 名称 | 描述 | 备注 |
|---|
| abs | 返回一个数字的绝对值 | |
| add | 将数字相加或将数字加在日期上 | |
| ceil | 向上取整,返回大于或等于给定数字的最小整数 | |
| divide | 传入被除数和除数,求商 | |
| exp | 取 e(自然对数的底数,欧拉数) 的 n 次方 | |
| floor | 向下取整,返回大于或等于给定数字的最小整数 | |
| ln | 计算给定数字在自然对数值 | |
| ... | | |
| | |
数组操作符
| 名称 | 描述 | 备注 |
|---|
| arrayElemAt | 返回在指定数组下标的元素 | db.command.aggregate.arrayElemAt([, ]) 查看详情 |
| arrayToObject | 将一个数组转换为对象 | |
| concatArrays | 将多个数组拼接成一个数组 | |
| filter | 根据给定条件返回满足条件的数组的子集 | |
| in | 给定一个值和一个数组,如果值在数组中则返回 true,否则返回 false | db.command.aggregate.in([, ]) |
| indexOfArray | 在数组中找出等于给定值的第一个元素的下标,如果找不到则返回 -1 | |
| isArray | 判断给定表达式是否是数组,返回布尔值 | |
| map | 类似 JavaScript Array 上的 map 方法,将给定数组的每个元素按给定转换方法转换后得出新的数组 | |