mongodb聚合管道中常见聚合函数的参考与演示——按顺序排序

2022-05-07

>说明数据准备聚合函数abs求绝对值add数字或日期相加addToSet返回唯一值数组allElementsTrue判断所有元素是否全为Trueandbool运算且anyElementTrue判断所有元素是否有一个为TruearrayElemAt获取数组的指定下标值arrayToObject将数组转换成对象avg求平均值binarySize查看字符串或二进制数据的内容大小(以字节为单位)bsonSize查看文档大小ceil向上取整cmp比较两个数并返回concat链接字符串并返回结果concatArrays链接数组并返回结果cond条件判断,if elseconvert转换类型count获取文档总数dateAdd添加时间dateDiff比较两个时间的差dateFromParts根据指定时间参数转换为时间类型dateFromString从字符串转换成事件类型dateSubtract递减时间dateToParts将时间解析成各个时间组成部分dateToString日期转字符串dateTrunc截断日期dayOfMonth查询一月之中的第几天、0-31dayOfWeek查询一周之中的第几天,1-7dayOfYear查询一年之中的第几天,0-365divide两数相除documentNumber返回文档在 $setWindowFields 阶段分区中的位置(称为文档编号)eq判断两值相等exp提高欧拉数(即e) 到指定的 index filter过滤数组first获取第一个元素,常用于数组floor向下取整getField获取某个字段的值gt、gte判断数值大于、大于等于某个值hour获取时间中的小时值ifNull先判断空值再取值in判断数组是否包含某个元素indexOfArray查询数组中指定元素indexOfBytes查询字符串中指定字符串的索引位置indexOfCP查询字符串中指定字符串的索引位置isArray判断是否为数组类型isNumber判断是否为数值类型isoDayOfWeekISO 查询一周之中的第几天,1-7isoWeekISO 查询一年之中的第几周,1-53isoWeekYearISO 查询年份last取最后一个文档last(Array)取数组中最后一个元素let声明变量操作变量literal返回一个不进行解析的值lnLog n计算对数loglog n 计算指定基数的对数log10计算基数为10的对数lt、lte判断数值小于、小于等于某个值ltrim去除左边的指定字符串、默认空格map遍历操作每个元素,并返回修改后的结果max获取最大值mergeObjects将多个文档合并为一个文档meta查看文档与索引的匹配分数min获取最小值millisecond获取某个时间的毫秒值,0-999minute获取某个时间的分钟值,0-59mod两个数取余month获取某个时间的月份值,1-12multiply两数相乘ne比较两数不相等not非、不objectToArray对象转成数组or或运算pow幂运算push往数组中添加元素radiansToDegressrand获取随机数,返回0-1之前的浮点数range获取一批有序数组reduce遍历数组组成一个值regexFind正则查找regexFindAll正则查找符合条件的所有项regexMatch判断是否匹配replaceOne替换第一次匹配的字符串replaceAll替换所有匹配的字符串reverseArray将数组前后颠倒round四舍五入rtrim去除右边的指定字符串、默认空格sampleRate按照几率随机采样文档second获取某个时间的秒值,0-59setDifference比较两个数组,寻找相较于第一个数组的差集setEquals比较多个数组是否含有相同元素setField添加、修改、移除字段setIntersection比较多个数组,并将交集结果返回setIsSubset比较两个数组判断子集setUnion比较多个数组,并将并集结果返回size获取数组大小slice切割数组split按照某字符切割字符串sqrt计算正数的平方根strcasecmp对比字符串大小,不区分大小写strLenBytes获取UTF8编码的字节数strLenCP返回UTF-8的数量substr、substrBytes截取字符串substrCP截取字符串subtract两数相减返回差值sum获取总数switchswitch case条件语句toBool转布尔类型toDate转时间类型toDecimal转换Decimal数值类型toDouble转换成Double类型toInt转换成Integer类型toLong转换成Long类型toObjectId转换成ObjectId类型toString转换成String类型toLower将字符串转为小写字母toUpper将字符串转为大写字母trim去除左右两边的指定字符串、默认空格trunc截取小数点,保留几位小数,默认不保留type查看类型unsetField删除查询文档结果中的字段week获取某个时间的周值,0-53year获取某个时间的年份值,0-9999zip转置数组

说明

仅为个人整理及理解,大多数都是参照官方文档,记录只是为了加深印象而已,有些数学函数未作测试,有些做了测试也还是没能理解这个函数有什么用...

未做测试的函数(大多为数学三角函数、方差函数):accumulator、acos、acosh、asin、asinh、atan、atan2、atanh、cos、cosh、covariancePop 、covarianceSamp、degreesToRadians、degreesRank、derivative、expMovingAvg、function、sin、sinh、stdDevSamp、tan、tanh

参考:Aggregation Pipeline Operators — MongoDB Manual

点击查看按照分类整理

数据准备

注意时间戳这里存的是以毫秒为单位的,让我们查看其中一条数据

image-20220425144130556

聚合函数

abs求绝对值

如求学生的数学成绩与60之间的绝对值

image-20220422114803321

add数字或日期相加

求学生的数学成绩与语文成绩总和,并将创建时间添加一天

添加时间时默认单位时毫秒,一天间隔 86400000 毫秒

image-20220425144222638

addToSet返回唯一值数组

仅支持在 $bucket、$bucketAuto、$group、$setWindowField这四个管道中使用

我们这里把Set理解成不重复的数组就很好理解了

如根据sex字段进行分组,并输出对应的年龄和语文成绩

image-20220422114848946

allElementsTrue判断所有元素是否全为True

官方例子

image-20220422112054058

andbool运算且

简单例子

查找语文、数学成绩都超过60(及格)的学生

image-20220425144304553

anyElementTrue判断所有元素是否有一个为True

官方例子

image-20220422113008412

arrayElemAt获取数组的指定下标值

下标-1即倒数第一个,-2即倒数第二个,依次往下

image-20220422115454679

arrayToObject将数组转换成对象

avg求平均值

仅支持在$addFields、$bucket、$bucketAuto、$group、$match、$project、$replaceRoot、$replaceWith、$set、$setWindowField这几个管道中使用

查看学生平均成绩

image-20220422134351421

binarySize查看字符串或二进制数据的内容大小(以字节为单位)

版本要求:v4.4+

官方例子

空格占1字节、中文符号占1字节、é占2字节、€占3字节λ占2字节、汉字占3字节

image-20220507101814022

bsonSize查看文档大小

版本要求:v4.4+

$$ROOT表示当前文档根目录,即整个文档

image-20220507102108338

ceil向上取整

image-20220422141318302

cmp比较两个数并返回

如a、b,若a大于b则返回1,a小于b则返回-1,a等于b则返回0

image-20220422141651836

concat链接字符串并返回结果

仅支持字符串链接,若为其他类型请先转成字符串

image-20220422142144081

concatArrays链接数组并返回结果

为每个学生添加 ['pear','bear']

image-20220422142409784

cond条件判断,if else

语法:{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case> } }

简写:{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

image-20220422143038387

convert转换类型

to类型:double、string、objectId、bool、date、int、long、decimal 严格区分大小写

image-20220422145341102

count获取文档总数

版本要求:5.0+

仅支持在 $bucket、$bucketAuto、$group、$setWindowField这四个管道中使用

如分组后获取总数

image-20220425142123729

dateAdd添加时间

版本要求:5.0+

更多请参考:$dateAdd (aggregation) — MongoDB Manual

startDate:初始时间,可以是时间类型、时间戳类型、ObjectId,但不能直接转换long类型

unit单位:year、quarter、week、month、day、hour、minute、second、millisecond

amount:正数为加,负数为减(dateSubtract效果)

timezone 一直测试不出来...,运行结果不达预期(bug?)

image-20220425152043126

dateDiff比较两个时间的差

版本要求:5.0+

如比较创建时间和最新更新时间,看看两者之间隔了多少月或多少周

image-20220425155152309

dateFromParts根据指定时间参数转换为时间类型

year和month是固定出现的,isoWeekYear、isoWeek、isoDayOfWeek也是固定出现的不能混起来使用

image-20220425160858859

dateFromString从字符串转换成事件类型

image-20220426101453736

dateSubtract递减时间

版本要求:5.0+

startDate:初始时间,可以是时间类型、时间戳类型、ObjectId,但不能直接转换long类型

unit单位:year、quarter、week、month、day、hour、minute、second、millisecond

amount:正数为减,负数为加(dateAdd效果)

image-20220426102118428

dateToParts将时间解析成各个时间组成部分

将一个时间类型的值返回year、month、day、hour、minute、second、millisecond,若指定了iso8601为true,则会返回isoWeekYear、isoWeek、 isoDayOfWeek、hour、minute、second、millisecond。

image-20220426103009642

dateToString日期转字符串

image-20220426111037621

dateTrunc截断日期

版本要求:v5.0+ 参考:$dateTrunc (aggregation) — MongoDB Manual

unit可指定:

year——当年的1月1日,无时间

quarter——当年当季的第一月1日,无时间

week——当年当周的第一天,无时间

month——当年当月1日,无时间

day——当年当月当日,无时间

hour——当年当月当日当时,无分秒

minute——当年当月当日当时分,无秒

second——当年当月当日当时分秒,无毫秒

binSize 一直没试成功,运行结果和自己预期的结果大相径庭,但又不知道怎么回事(bug?)

image-20220507104832368

image-20220507105608460

image-20220507105837307

image-20220507110105984

dayOfMonth查询一月之中的第几天、0-31

image-20220426115916152

dayOfWeek查询一周之中的第几天,1-7

image-20220426120037563

dayOfYear查询一年之中的第几天,0-365

image-20220426134608590

divide两数相除

前者除以后者,如学生的年龄除以10

image-20220426140912986

documentNumber返回文档在 $setWindowFields 阶段分区中的位置(称为文档编号)

版本要求:5.0+

仅支持在setWindowFields阶段中使用,不知道有什么用...

image-20220507111955463

eq判断两值相等

相等返回True,否则返回false

image-20220426141104883

exp提高欧拉数(即e) 到指定的 index

不知道有什么用

image-20220426141513904

filter过滤数组

基础语法

查询学生爱好中包含"apples"选项

image-20220426142229394

first获取第一个元素,常用于数组

版本要求:5.0+,与last取最后元素相对应

仅支持在bucket、bucketAuto、group、setWindowFields阶段中使用

如男生女生各取一名学生信息

image-20220426142638810

floor向下取整

与ceil向上取整相对应

image-20220426143710139

getField获取某个字段的值

版本要求:5.0+,常用于处理含有.$的字段

官方例子

查询价格超过50的,并输出小号的数量

image-20220426150121176

gt、gte判断数值大于、大于等于某个值

与lt、lte小于、小于等于相对应

image-20220426150757901

hour获取时间中的小时值

image-20220426162151987

ifNull先判断空值再取值

版本要求:5.0+

如我们要取一个值,若Info字段不为null则取Info,否则取name字段,若name字段为null,则取favorites,我们可以这样写

image-20220426164410569

in判断数组是否包含某个元素

如查找喜欢吃“apples”的同学

image-20220426164918078

indexOfArray查询数组中指定元素

查询数组中指定元素,若包含指定元素则返回第一次出现的索引,若不包含则返回-1

基础语法

如查找favorites数组中apples出现的位置

image-20220426170124641

indexOfBytes查询字符串中指定字符串的索引位置

查询字符串中第一次出现的UTF-8字符并返回索引,若不包含则返回-1

基础语法

如查找学生名字带有a字符串的学生

image-20220426171022667

indexOfCP查询字符串中指定字符串的索引位置

查询字符串中第一次出现的字符串并返回索引,若不包含则返回-1,不明白indexOfCP和indexOfBytes有什么区别

基础语法

如查找学生名字带有a字符串的学生

image-20220426173611939

isArray判断是否为数组类型

固定语法:$isArray:[ 值 ] 注意值外面是用中括号包起来的

image-20220426175635277

isNumber判断是否为数值类型

若类型为Integer、Decimal、Double、Long都属于数值类型,都返回true,其余都返回false

image-20220426180644984

isoDayOfWeekISO 查询一周之中的第几天,1-7

image-20220426181216026

isoWeekISO 查询一年之中的第几周,1-53

image-20220426181312685

isoWeekYearISO 查询年份

image-20220426181356048

last取最后一个文档

版本要求:5.0+,与first取最后元素相对应

仅支持bucket、bucketAuto、group、setWindowFields阶段中使用

image-20220426181808296

last(Array)取数组中最后一个元素

固定语法:$last:[ 值 ]注意值外面是用中括号包起来的

image-20220426182255970

let声明变量操作变量

基础语法

如获取语文、数学成绩总和然后判断总分评级,超过150则为优秀,否则为良好

image-20220426184614354

literal返回一个不进行解析的值

常用于含有.$1的字段,相当于一个转义符,在literal中.$1仅仅是个字符串,无特殊意义

官方例子

image-20220427100159331

lnLog n计算对数

image-20220427100628606

loglog n 计算指定基数的对数

{$log:[数值,基数]}基数要大于1

image-20220427101116319

log10计算基数为10的对数

image-20220427101617820

lt、lte判断数值小于、小于等于某个值

查询年龄小于50且数学成绩小于等于60的学生

ltrim去除左边的指定字符串、默认空格

基础语法,与rtrim相对应

image-20220427102905062

map遍历操作每个元素,并返回修改后的结果

基础语法,通常操作数组

如在favorites的每一项前加上"我喜欢"

image-20220427104013775

max获取最大值

image-20220427104932039

mergeObjects将多个文档合并为一个文档

仅支持bucket、bucketAuto、group、replaceRoot阶段中使用

若文档中有相同元素则以最后一个文档为主,不同元素会合并为一个对象

合并相同元素,如根据性别分组后合并成绩

image-20220427110608657

合并不同元素——将合并后的成绩加个日期

image-20220427110744733

meta查看文档与索引的匹配分数

可设置:

textScore,必须与$text全文索引一起使用,否则会报错,v4.4以下版本会返回null,不会报错

indexKey,如果使用非文本索引,则返回文档的索引键,版本要求v4.4+

没看出来有什么用...

image-20220507112848491

image-20220507113725252

image-20220507113907564

min获取最小值

image-20220427111101621

millisecond获取某个时间的毫秒值,0-999

image-20220427112332722

minute获取某个时间的分钟值,0-59

image-20220427112445513

mod两个数取余

注意:不能对0取余

image-20220427112756822

month获取某个时间的月份值,1-12

image-20220427112915863

multiply两数相乘

image-20220427113125687

ne比较两数不相等

不相等则返回true,否则返回false,not equal的缩写

如查找数学成绩不等于60的学生

image-20220427113419226

not非、不

如查找数学成绩不及格的学生,非大于等于那就是小于的意思

image-20220427113738735

objectToArray对象转成数组

image-20220427135629724

or或运算

True:true、1、[]、str False:false、0、null、undefined

image-20220427140039090

pow幂运算

image-20220427140354015

push往数组中添加元素

仅支持bucket、bucketAuto、group、setWindowFields阶段中使用

image-20220427140828402

radiansToDegress

rand获取随机数,返回0-1之前的浮点数

image-20220427142145402

range获取一批有序数组

基础语法,遵循左闭右开原则

image-20220427142902794

reduce遍历数组组成一个值

基础语法

计算从1到10的总积,

image-20220427143920854

regexFind正则查找

版本要求:4.2+

基础语法

im选项匹配

image-20220427154938940

xm选项匹配

image-20220427155030618

regexFindAll正则查找符合条件的所有项

版本要求:4.2+

和regexFind的用法一样,只是regexFindAll会找出所有匹配的项

image-20220427155923299

regexMatch判断是否匹配

版本要求:4.2+,和regexFind的用法一样,只是regexMatch匹配成功会返回true,否则返回false

image-20220427160309763

replaceOne替换第一次匹配的字符串

版本要求:4.4+

基础语法

如将学生姓名中的第一个a替换成AAAAA

image-20220427161210818

replaceAll替换所有匹配的字符串

版本要求:4.4+,和replaceOne用法一致

如将学生姓名中的e全部替换成EEEEE

image-20220427161610737

reverseArray将数组前后颠倒

image-20220427162056668

round四舍五入

基础语法

image-20220427162444605

rtrim去除右边的指定字符串、默认空格

基础语法,与ltrim去除左边相对应

image-20220427163730192

sampleRate按照几率随机采样文档

版本要求:4.4.2+

image-20220427164125802

second获取某个时间的秒值,0-59

image-20220427164236059

setDifference比较两个数组,寻找相较于第一个数组的差集

image-20220427165047256

setEquals比较多个数组是否含有相同元素

若多个数组均含有相同元素则返回false,否则返回true,无关顺序

image-20220427165914932

setField添加、修改、移除字段

基础语法

setIntersection比较多个数组,并将交集结果返回

image-20220427170919490

setIsSubset比较两个数组判断子集

若第一个数组是第二个数组的子集,则将结果为true,否则为false

image-20220427180646240

setUnion比较多个数组,并将并集结果返回

image-20220427181229939

size获取数组大小

image-20220427182027405

slice切割数组

基础语法

image-20220427182446948

split按照某字符切割字符串

image-20220427182750163

sqrt计算正数的平方根

image-20220427183012339

strcasecmp对比字符串大小,不区分大小写

A与B进行比较,若A大于B则返回1,相等则返回0,小于则返回-1

image-20220427183420815

strLenBytes获取UTF8编码的字节数

image-20220428154445371

strLenCP返回UTF-8的数量

image-20220428154631884

substr、substrBytes截取字符串

mongo3.4+后,两个都是一个意思substr是substrBytes的别名,仅仅演示substr

image-20220428155138449

substrCP截取字符串

官方例子

不理解

image-20220507141836301

subtract两数相减返回差值

如查看学生年龄离30岁还有多远

image-20220428155554379

sum获取总数

仅支持addFields、bucket、bucketAuto、group、match、project、replaceRoot、replaceWith、set、setWindowFields阶段中使用

如按照学生性别分组,分别计算出数学、语文的总成绩

image-20220428155941870

switchswitch case条件语句

判断数学成绩,给出相应评级

image-20220428160652174

toBool转布尔类型

Double、Decimal、Integer、Long类型若值不为0则返回true,否则返回false

ObjectId、String、Date都会返回true,注意字符串的false也会转成true,有点不理解...

image-20220428162217041

toDate转时间类型

支持时间戳(毫秒)、字符串、ObjectId转成时间类型

image-20220428165037112

toDecimal转换Decimal数值类型

false会返回0,true会返回1,Double、Integer、Long、String均会返回Decimal类型的数值

注意:Sting一定要是数值,不支持objectId类型,Date会返回Decimal类型的时间戳值(ms)

image-20220428170332639

toDouble转换成Double类型

false会返回0,true会返回1,Decimal、Integer、Long、String均会返回Double类型的数值

注意:Sting一定要是数值,不支持objectId类型,Date会返回Double类型的时间戳值(ms)

image-20220428170545051

toInt转换成Integer类型

false会返回0,true会返回1,Decimal、Integer、Long、String均会返回Int类型的数值

注意:Sting一定要是数值、不能包含小数点且不能超过Int的精度范围,不支持objectId、Date类型,Decimal、Double会截断小数点只返回整数、Long类型的值不能超过Int的精度

image-20220428171321506

toLong转换成Long类型

false会返回0,true会返回1,Decimal、Integer、Double、String均会返回Long类型的数值

注意:Sting一定要是数值、不能包含小数点且不能超过Long的精度范围,不支持objectId,Decimal、Double会截断小数点只返回整数,Date会返回Long类型的时间戳值(ms)

image-20220428172937191

toObjectId转换成ObjectId类型

仅支持String类型,且要可转成ObjectId类型

image-20220428173206557

toString转换成String类型

支持所有类型

image-20220428173454370

toLower将字符串转为小写字母

如将学生名字转为小写

image-20220428173738422

toUpper将字符串转为大写字母

image-20220428173910515

trim去除左右两边的指定字符串、默认空格

image-20220428195036785

trunc截取小数点,保留几位小数,默认不保留

image-20220428195352318

type查看类型

image-20220428200611740

unsetField删除查询文档结果中的字段

通常用于含有$.的字段,常与replaceWith一起使用

官方例子

week获取某个时间的周值,0-53

周从星期日开始,第 1 周从一年中的第一个星期日开始。一年中第一个星期日之前的日子在第 0 周

支持Timestamp、Date、ObjeciID

image-20220429101416411

year获取某个时间的年份值,0-9999

zip转置数组

基础语法

image-20220504165002694