在MongoDB聚合统计过程中,经常使用表达式运算符用于构造用于聚合管道阶段的表达式。运算符表达式类似于接受参数的函数。通常,这些表达式采用参数数组,并具有以下形式:
{ <operator>: [ <argument1>, <argument2> ... ] }
如果运算符接受单个参数,则可以忽略指定参数列表的外部数组:
{ <operator>: <argument> }
例如分组按条件计数统计案例:
使用了'$concat'、'$substr'、'$sum'、'$cond'、'$eq'、'$lt'
等运算符,详见如下代码:
db.getCollection('customerfeature').aggregate([
{'$project':{'yearmonth':'$yearmonth','lateststatus':'$lateststatus','trademonth':{'$concat':[{'$substr':['$occurtime',0,4]},{'$substr':['$occurtime',5,2]}]}}},
{'$group':{'_id':'$yearmonth',
'allcount':{'$sum':1},
'activecount':{'$sum':{'$cond':[{'$eq':['$trademonth','$yearmonth']},1,0]}},
'count':{'$sum':{'$cond':[{'$lt':['$lateststatus',3]},1,0]}},
'churncount':{'$sum':{'$cond':[{'$eq':['$lateststatus',3]},1,0]}}
}},
{'$sort':{'_id':1}}
],
{'allowDiskUse':true})
注意小心得:
- 首先,表达式形式为中括号“[]”,避免与大括号“{}”混淆;
- 其次,参数为引用数据,前面加“$”符号。
其中,原数据集中occurtime为字符串,格式为yyyy-mm-dd,例如:2017-11-02。
其中:
$concat
连接操作符,将给定表达式中的字符串连接一起。用法:
{ $concat: [ <expression1>, <expression2>, ... ] }
$substr
用于返回子字符串。用法:
{ $substr: [ <string>, <start>, <length> ] }
$cond
条件操作符。用法:
{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }
$eq
比较表达式中两个是否相等,是则返回true,否则返回false。
用法{ $eq: [ <expression1>, <expression2> ] }
参考:
[1]. Aggregation Pipeline Operators. MONGODB MANUAL 4.0
[2]. 莫问今朝. 【mongoDB查询进阶】聚合管道(三)–表达式操作符 . 博客园 . 2018.03