MongoDB:聚合查询

聚合操作

聚合操作的标准格式:

#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}}}])

image-20210110203859088

求gender性别各多少条(按照gender分组):

db.user.aggregate([{'$group':{'_id':'$gender','genderNum':{'$sum':1}}}])

image-20210110204123641

求年龄的总和:

#求和的字段是age
db.user.aggregate([{'$group':{'_id':null,'ageSum':{'$sum':'$age'}}}])

按照gender分组,求出年龄总和

db.user.aggregate([{'$group':{'_id':'$gender','ageSum':{'$sum':'$age'}}}])

image-20210110204503015

$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}}}])

image-20210110210122326

$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']}}}])

image-20210110212228534

$toLower $toUpper

toLower:字符串转小写

toUpper:字符串转大写

db.user.aggregate(
[
{'$project':{'name':{'$toUpper':'$name'}}}
]
)

$dateToStr

该表达式可以对日期进行格式化

db.user.aggregate([{'$project':{'date':{'$dateToString':{'format':'%Y-%m-%d','date':'$birth'}}}}])

image-20210110213703914

image-20210110213812112

数学运算符

MongoDB中,数学类型(int/long/double)和日期类型(date)可以做数学运算,日期只能做加减,且加减的单位是毫秒

  • $add 加
  • $subtract 减
  • $multiply 乘
  • $divide 除
  • $mod 取余

查询所有人明年的年龄和他的名字name:

db.user.aggregate([{'$project':{'age':{'$add':['$age',1]},'name':'$name','_id':0}}])

image-20210110214516984

原文地址:https://www.cnblogs.com/wwjj4811/p/14259715.html