05-聚合管道

nobility 发布于 2022-12-04 2705 次阅读


聚合管道

  • db.collection.aggregate(pipeline,options):聚合函数,该方法返回的是一个游标
    • pipeline:管道数组,每个数组元素都是一个管道对象,管道对象就是拥有管道阶段操作符的对象,从第一个元素开始,依次进行过滤
    • options:聚合操作时的选项,可省
      • allowDiskUse:当内存不足时是否使用磁盘;每个聚合管道阶段使用的内存上限是100MB,若超过上限就会抛出错误,开启该参数就不会抛出错误,而是会利用磁盘进行计算

管道阶段操作符

在管道操作符对象中想引用输入文档的某个属性时,需要使用$field的形式(必须使用双引号包裹),对于内嵌文档(数组是特殊的内嵌文档)查询时同样可以使用点运算符

对于一些可以通过更改管道阶段顺序但不影响结果的操作,MongoDB会对其顺序自动优化

  • {$project:{field:value,...}}:对输入文档进行再次投影,投影方式与投影文档一致,更加强大的是可以再投影(字段、字段值的重命名)
    • 若再投影中用到输入文档的某个属性,就不能将某个属性投影关闭
    • 若投影文档不存在字段会自动补充null,对于文档中null不会显式输出,对于数组中null会显式输出
  • {$match:{field:value,...}}:对输入文档进行筛选,筛选方式与查询文档一致
  • $limit:number:接受一个正整数表示对输入文档个数进行限制
  • {$skip:number}:接受一个正整数表示跳过输入文档的前几个文档
  • {$unwind:{field:value,...}}:展开输入文档中的数组字段,展开操作就是生成除指定数组字段以外,其他字段都相同的多个文档,若指定字段不是数组则不会进行操作
    • path:指定用于展开的数组字段,若输入文档中该字段为空或字段为空数组时会被剔除
    • includeArrayIndex:为展开的文档添加一个在原数组的位置索引字段,字段名可以随意,若字段不是数组时该字段值为null
    • preserveNullAndEmptyArrays:是否保留path指定字段为空或字段为空数组的文档,默认false
  • {$sort:{field:number,...}}:对输入文档进行排序,正一代表正向排序,负一代表逆向排序
  • {$lookup:{field:value,...}}:输入文档与其他文档进行关联查询
    • from:指定另一个要进行关联查询的集合(不能跨数据库)
    • localField:输入文档中要关联字段
    • foreignField:另一个集合中要关联的字段
    • as:将符合关联查询的另一个集合中的文档中以数组的形式添加到输入文档中,该属性用来指定新插入的字段名
    • pipeline:对另一个集合再进行管道处理,无法与localFieldforeignField字段混用,只能做不相关查询
    • let:若pipeline中想使用输入文档中字段时,必须在该对象中进行声明变量,以$$变量名方式使用
  • {$group:{field:value,...}}:对输入文档进行分组
    • _id:指定要分组的字段,若为null,则所有文档都分为一组
    • newField:{$sum:value}:对指定分组前的字段(可以是表达式)求和后,放入分组后新的字段
    • newField:{$avg:value}:对指定分组前的字段(可以是表达式)求平均值后,放入分组后新的字段
    • newField:{$max:value}:对指定分组前的字段(可以是表达式)求最大值后,放入分组后新的字段
    • newField:{$min:value}:对指定分组前的字段(可以是表达式)求最小值后,放入分组后新的字段
    • newField:{$push:value}:对指定分组前的字段(可以是表达式)的字段值值后,以数组方式分组后新的字段
  • $out:将输入文档进行输出到另一个集合中,在管道中只能出现一次
    • 若集合存在会覆盖掉之前的集合
    • 若该阶段遇到错误,则不会写入,只会抛出异常

聚合表达式

算数表达式

表达式 描述
{$abs:number} 返回number的绝对值
{$ceil:number} 返回number向上取整
{$floor:number} 返回number向下取整
{$trunc:number} 返回number的整数部分
{$add:[expression,...]} 返回数组中元素的加和
{$multiply:[expression,...]} 返回数组中元素的乘积

比较表达式

表达式 描述
{$eq:[value1,value2]} 判断两个值是否相等
{$gt:[value1,value2]} 判断第一个值是否大于第二个值
{$gte:[value1,value2]} 判断第一个值是否大于等于第二个值
{$lt:[value1,value2]} 判断第一个值是否小于第二个值
{$lte:[value1,value2]} 判断第一个值是否小于等于第二个值
{$ne:[value1,value2]} 判断两个值是否不相等

逻辑表达式

表达式 描述
{$and:[expression,...]} 数组内所有表达式的与
{$or:[expression,...]} 数组内所有表达式的或
{$not:[expression]} 数组内表达式的取反,注意该数组只能有一个元素

数组表达式

表达式 描述
{$in:[expression,array]} 判断元素是否在数组中存在
{$size:array} 返回数组长度

条件表达式

表达式 描述
{$ifNull:[expression,defaule]} 若元素为空则用defaule进行替换
$cond:{if:{expression},then:trueValue,else:falseValue} 三元表达式,若表达式为真返回trueValue厚泽返回falseValue
此作者没有提供个人介绍
最后更新于 2022-12-04