回顾相关文章累加器(Accumulators)——主要用于$group分组参考MongoDB官网:https://docs.mongodb.com/manual/reference/operator/aggregation本文主要内容是管道运算符中的表达式运算符。表达式运算符(ExpressionOperators)表达式运算符主要用于在管道中构造表达式时。它们需要类似于函数的参数。它们主要用于$project运算符来构造表达式。它们一般使用如下:方法一:{:[,...]}方法二:{:}表达式运算符分类布尔运算符(BooleanOperators)集合运算符集合运算符比较运算符算术运算符字符串运算符文本搜索运算符数组运算符变量运算符字面量运算符日期运算符条件运算符数据类型运算符常用表达式运算符布尔运算符表达是真实的。用法:{$and:[,,...]}。$or逻辑或运算符在其表达式中的值为真时返回真。用法:{$or:[,,...]}$非取反运算符,返回表达式取反后的布尔值。用法:{$not:[]}Exampleexampleresult{$and:[1,"green"]}true{$and:[]}true{$and:[[null],[false],[0]]}true{$and:[null,true]}false{$and:[0,true]}false{$or:[true,false]}true{$or:[[false],false]}true{$or:[null,0,undefined]}false{$or:[]}false{$not:[true]}false{$not:[[false]]}false{$not:[false]}true{$not:[null]}true{$not:[0]}true比较运算符(ComparisonOperators)运算符简介$cmp比较运算符,比较表达式中两个值的大小,如果第一个valueislessthan第二个值返回-1,相等返回0,大于则返回1。用法{$cmp:[,]}$eq比较表达式中的两个是否相等,若相等则返回true,否则返回false。用法{$eq:[,]}$gt比较表达式中的第一个值是否大于第二个值,如果是则返回真,否则返回假。用法{$gt:[,]}$gte比较表达式中的第一个值是否大于等于第二个值,是则返回真,否则返回假。用法{$gte:[,]}$lt比较表达式中的第一个值是否小于第二个值,如果是则返回真,否则返回假。用法{$lt:[,]}$lte比较表达式中的第一个值是否小于等于第二个值,如果是则返回真,否则返回假。用法{$lte:[,]}$ne比较两个表达式是否相等,返回值与$eq相反,若相等则返回false,否则返回true。用法{$ne:[,]}例子假设有一个关于考试成绩的集合:{"_id":1,"name":"abc1",score:80}{"_id":2,“名称”:“avc1”,得分:82}{“_id”:3,“名称”:“adc1”,得分:79}{“_id”:4,“名称”:“awc1”,得分:60}{"_id":5,"name":"xyz1",score:50}{"_id":6,"name":"VWZ1",score:100}操作如下:db.collection.aggregate([{$project:{name:1,score:1,cmp60:{$cmp:["$score",60]},eq100:{$eq:["$score",100]},gt80:{$gt:["$score",80]},gte80:{$gte:["$score",80]},lt80:{$lt:["$score",80]},lte80:{$lte:["$score",80]},ne100:{$ne:["$score",100]},_id:0}}])返回结果:{"name":"abc1",score:80,cmp60:1,eq100:false,gt80:false,gte80:true,lt80:false,lte80:true,ne100:true}{"name":"avc1",score:82,cmp60:1,eq100:false,gt80:true,gte80:true,lt80:false,lte80:false,ne100:true}{"name":"adc1",score:79,cmp60:1,eq100:false,gt80:false,gte80:false,lt80:true,lte80:false,ne100:true}{"name":"awc1",score:60,cmp60:0,eq100:false,gt80:false,gte80:false,lt80:true,lte80:true,ne100:true}{"name":"xyz1",score:50,cmp60:-1,eq100:false,gt80:false,gte80:false,lt80:true,lte80:true,ne100:true}{"name":"VWZ1",score:100,cmp60:1,eq100:true,gt80:true,gte80:true,lt80:false,lte80:false,ne100:false}MathematicalOperators数值运算符,v3.2版本新增用法:{$abs:}$add求和运算符,返回所有表达式相加的结果。用法:{$add:[,,...]}$ceil舍入运算符,v3.2版本新增。用法:{$ceil:}$divide商运算符,返回表达式1除以表达式2的商。用法:{$divide:[,]}$subtract差运算符,返回结果从表达式1中减去表达式2。用法:{$subtract:[,]}$multiply乘积运算符返回所有表达式相乘的结果。Usage:{$multiply:[,,...]}$mod余数运算符,返回表达式1除以表达式2得到的余数。Usage:{$multiply:[,]}示例示例结果{$abs:-1}1{$abs:1}1{$abs:null}null{$add:[1,1]}2{$ceil:1}1{$ceil:7.80}8{$ceil:-2.8}-2{$divide:[40,8]}5{$subtract:[10,8]}2{$multiply:[5,8]}40{$mob:[80,7]}3{$mob:[80,8]}0Tips:$add添加日期类型和数字类型会变成日期类型。这样当数据库存储时间戳但需要对其使用日期运算符时,可以使用该方法先将其做成日期类型,再使用日期运算符。使用参考:{$add:[newDate(0),'$ts']}。字符串运算符(StringOperators)运算符简介$concat连接运算符,将给定表达式中的字符串连接在一起。用法:{$concat:[,,...]}$split切割运算符用于分割字符串。用法:{$split:[,]}$toLower用于返回字符串的小写形式。用法:{$toLower:}$toUpper用于返回字符串的大写形式。用法:{$toUpper:}$substr用于返回一个子串,不推荐v3.4+版本,应该使用substrBytes或者substrCP,如果使用v3.4+版本,相当于substrBytes。用法:{$substr:[,,]}$substrBytes用于根据UTF-8下的字节位置返回一个子串(起始位置为0),v3.4新增.Usage:{$substrBytes:[,,]}$substrCP用于根据UTF-8下的CodePoint位置返回一个子串(起始位置为0),在v3中.4添加。Usage:{$substrCP:[,,]}CodePoint:(1)Unicode代码空间中的任意值;也就是说,整数范围从0到10FFFF16。并非所有代码点都分配给编码字符。请参阅代码点类型。(2)字符在任何编码字符集中的值或位置。示例示例结果{$concat:["item","-","a"]}item-a{$split:["June-15-2013","-"]}["June","15","2013"]{$split:["bananasplit","a"]}["b","n","n","split"]{$split:["headphonejack",7]}$split第二个参数必须是字符串,不能是数字{$toLower:"ITEM"}"item"{$toLower:"Item"}"item"{$toLower:null}""{$toUpper:"item"}"ITEM"{$toUpper:"Item"}"ITEM"{$toUpper:null}""{$substrBytes:["abcde",1,2]}"bc"{$substrBytes:["HelloWorld!",6,5]}"World"{$substrBytes:["cafétéria",0,5]}"café"{$substrBytes:["cafétéria",5,4]}"tér"{$substrBytes:["cafétéria",7,3]}"错误:无效范围,起始索引是一个UTF-8连续字节。"{$substrBytes:["cafétéria",3,1]}"错误:无效范围,结束索引在UTF-8字符的中间。"{$substrBytes:["sushi",0,3]}"寿"{$substrCP:["abcde",1,2]}"bc"{$substrCP:["HelloWorld!",6,5]}"World"{$substrCP:["cafétéria",0,5]}"cafét"{$substrCP:["cafétéria",5,4]}"tér"{$substrCP:["cafétéria",7,3]}"ia"{$substrCP:["cafétéria",3,1]}"é"{$substrCP:["sushisushi",0,3]}"Sushis"日期运算符(DateOperators)运算符简介$dayOfYear返回日期年份,值介于1和366(闰年)之间用法:{$dayOfYear:}$dayOfMonth返回月份中的第几天,值介于1和31之间。用法:{$dayOfMonth:>}$dayOfWeek返回星期几,值介于1(星期日)和7(星期六)之间。用法:{$dayOfWeek:}$year返回年份,例如:2017。用法:{$year:}$month返回值介于1和12之间的月份。用法:{$month:}$week返回值介于0和53之间的星期。用法:{$week:When}$hour返回,值介于0到23之间。用法:{$hour:}$minute返回分钟,值介于0到59之间。用法:{$minute:}$second返回值介于0和60(闰秒)之间的秒。用法:{$second:}$millisecond返回毫秒数,值介于0和999之间。用法:{$millisecond:}$dateToString返回日期字符串。用法:{$dateToString:{format:,date:}}例子如果有如下数据:{"_id":1,"item":"abc","price":10,"quantity":2,"date":ISODate("2014-01-01T08:15:39.736Z")}执行以下操作:db.collection.aggregate([{$project:{year:{$year:"$date"}月:{$month:"$date"}日:{$dayOfMonth:"$date"}小时:{$hour:"$date"}分钟:{$minute:"$date"},秒:{$second:"$date"},毫秒:{$millisecond:"$date"},dayOfYear:{$dayOfYear:"$date"},dayOfWeek:{$dayOfWeek:"$date"},周:{$week:"$date"},yearMonthDayUTC:{$dateToString:{格式:"%Y-%m-%d",日期:"$date"}},时间:{$dateToString:{格式:"%H:%M:%S:%L",date:"$date"}}}}])返回结果:{"_id":1,"year":2014,"month":1,"day":1,"小时":8,"分钟":15,"秒":39,“毫秒”:736,“dayOfYear”:1,“dayOfWeek”:4,“周”:0,“yearMonthDayUTC”:“2014-01-01”,“时间”:“08:15:39:736"}条件运算符(ConditionalOperators)运算符简介$cond用法:{$cond:[,,]}orv2.6+也支持{$cond:{if:,then:,else:}}$ifNull用法:{$ifNull:[,]}例子假设有一个关于考试成绩的集合:{"_id":1,"name":"a",score:80}{"_id":2,"name":"b",score:69}{"_id":3,"name":"c",score:53}{"_id":3,"name":null,score:70}操作如下:db.collection.aggregate([{$项目:{_id:0,分数:1,通过:{$cond:[{$gte:["$score",60]},1,0]},描述:{$ifNull:["$name",“未指定”]}}}}])返回结果:{“name":"a",score:80,pass:1}{"name":"b",score:69,pass:1}{"name":"c",score:53,pass:0}{"name":"Unspecified",score:70,pass:1}Summary本文介绍了表达式运算符的分类和常用表达式运算符的用法,表达式运算符主要在$project下使用,通过使用这些运算符可以处理字符并返回文档中的字面值,之后返回更多有用的数据,感谢阅读~