• 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

  • 相关阅读:
    文件的复制
    反射基础知识
    蓝牙连接 返回的命令
    WebRoot 与 webContent的区别
    时间判断
    java ecplise配置
    异常org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 11; 注释中不允许出现字符串 "--"。的原因
    F、CSL 的神奇序列 【规律】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
    E、CSL 的魔法 【模拟】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
    D、CSL 的字符串 【栈+贪心】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14259715.html
Copyright © 2020-2023  润新知