聚合操作
聚合操作的标准格式:
#pipeline表示不同的聚合操作
db.collection.aggregate([
{<pipeline_1>},
{<pipeline_2>},
...
])
先创建一些数据
db.createCollection('user');
db.user.insertMany([
{'name':'n1','age':20,'gender':'m','birth':new ISODate('2000-01-01'),'pswd':'1'},
{'name':'n2','age':21,'gender':'f','birth':new ISODate('1999-01-01'),'pswd':'2'},
{'name':'n3','age':22,'gender':'m','birth':new ISODate('1998-01-01'),'pswd':'3'},
{'name':'n4','age':23,'gender':'f','birth':new ISODate('1997-01-01'),'pswd':'4'},
{'name':'n5','age':24,'gender':'m','birth':new ISODate('1996-01-01'),'pswd':'5'},
]);
下面介绍一些常用的聚合操作。
$sum求和
求user集合中文档个数
# 按照id分组(这里id取null,相当于不分组或分成一组),每一条数据为1并累加(组里有几条数据就累加几次)
db.user.aggregate([{'$group':{'_id':null,'getSum':{'$sum':1}}}])
求gender性别各多少条(按照gender分组):
db.user.aggregate([{'$group':{'_id':'$gender','genderNum':{'$sum':1}}}])
求年龄的总和:
#求和的字段是age
db.user.aggregate([{'$group':{'_id':null,'ageSum':{'$sum':'$age'}}}])
按照gender分组,求出年龄总和
db.user.aggregate([{'$group':{'_id':'$gender','ageSum':{'$sum':'$age'}}}])
$match条件
求年龄大于22的总计个数
在分组聚合前,添加上$match条件筛选(相当于sql中的where筛选)
db.user.aggregate([{'$match':{'age':{'$gt':22}}},{'$group':{'_id':null,'num':{'$sum':1}}}])
求gender=m的总条数
db.user.aggregate([{'$match':{'gender':'m'}},{'$group':{'_id':null,'num':{'$sum':1}}}])
按照gender分组,找出人数大于2的组(有点像sql中的having)
db.user.aggregate([{'$group':{'_id':'$gender','num':{'$sum':1}}},{'$match':{'num':{'$gt':2}}}])
$max和$min
#查找age最大的一条
db.user.aggregate([{'$group':{'_id':null,'ageMax':{'$max':'$age'}}}])
#查找birth最小的一条
db.user.aggregate([{'$group':{'_id':null,'birthMin':{'$min':'$birth'}}}])
$avg平均值
求年龄平均值(只能是数字类型)
db.user.aggregate([{'$group':{'_id':null,'ageAvg':{'$avg':'$age'}}}])
$project
如果文档中字段较多,而我们只想查出部分字段,我们就可以使用$project。将显示的字段设置为1,其余字段默认不显示,'_id'字段较为特殊,默认显示,如果需要不显示该字段,则可以设置为0。
db.user.aggregate([{'$project':{'_id':0,'name':1,'age':1}}])
该字段可以搭配其他操作符使用
$substr
截取字符串,截取name,从0开始,往后截取一位
db.user.aggregate([{'$project':{'name':{'$substr':['$name',0,1]}}}])
$concat
字符串合并方法,只可用于字符串
db.user.aggregate([{'$project':{'info':{'$concat':['$name','$gender']}}}])
$toLower $toUpper
toLower:字符串转小写
toUpper:字符串转大写
db.user.aggregate(
[
{'$project':{'name':{'$toUpper':'$name'}}}
]
)
$dateToStr
该表达式可以对日期进行格式化
db.user.aggregate([{'$project':{'date':{'$dateToString':{'format':'%Y-%m-%d','date':'$birth'}}}}])
数学运算符
MongoDB中,数学类型(int/long/double)和日期类型(date)可以做数学运算,日期只能做加减,且加减的单位是毫秒
- $add 加
- $subtract 减
- $multiply 乘
- $divide 除
- $mod 取余
查询所有人明年的年龄和他的名字name:
db.user.aggregate([{'$project':{'age':{'$add':['$age',1]},'name':'$name','_id':0}}])