在MongoDB中我们可以通过aggregate()函数来完成一些聚合查询,aggregate()函数主要用于处理诸如统计,平均值,求和等,并返回计算后的数据结果

语法:

db.collection.aggregate([
    {
        $group:{
            id:{"$分组键名","$分组键名","$分组键名"....}
            别名:{聚合运算:"$运算列"}
        }  
    },
    {
        条件筛选:{键名:{运算条件:运算值}}
    }
])

常见的Mongo聚合操作和mysql的查询做对比

image

1、$sum求和

1)查询test集合中 一共有多少个文档

相当于sql语句 select count(*) as count form test

db.test.aggregate([    
    {
        $group:{
        _id:null, //null表示不作任何分组
        count:{$sum:1}  
        }
    }
])

clipboard

2)查询test集合中所有size键中值的总和

相当于sql语句:select count(size) as totalSize from test

db.test.aggregate([
    {        
        $group:{
            _id:null,
            count:{$sum:"$size"} //$size表示文档中size的值        
        }    
    }
])

clipboard

3)对test集合中的每一个title进行分组,并计算每组size的总和

相当于sql语句 select title as _id,sum(size) as totalSize from test group by title

db.test.aggregate([
    {        
        $group:{
            _id:"$title",
            count:{$sum:"$size"} //$size表示文档中size的值        
        }    
    }
])

clipboard

2、条件筛选 $match

1)查询test集合中有多少文档的size大于300

相当于sql语句:select count(*) from dev where size > 300

db.test.aggregate([    
    {$match: {size:{$gt:300}}},
    {$group:{_id:null,totalCount:{$sum:1}}}
])

clipboard

2)查询test集合,根据title分组计算出每组size的总和,并过滤掉小于等于200的文档

相当于sql语句:select title as _id,sum(size) as totalSize group by title having totalSize > 200

clipboard

3 最大值 $max

查询dev集合中size最大的文档

clipboard

4 $min 最小值

查询dev集合中size最小的文档

clipboard

5 $avg 平均值

查询dev集合中size平均值

clipboard

6 $push 统计结果返回数组

查询dev集合,按照size分组并返回title,如果size相同则使用数组返回他们的title

clipboard

7 $unwind 对数组字段进行拆分

clipboard

8 管道操作

什么是管道操作:

管道在Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理

管道操作符:$match,$group,$sort $limit $skip $unwind

9 $project 聚合投影约束

查询test集合,将数组中的内容拆分显示,并且只显示title和tags键

clipboard

查询test集合,将数组中的内容拆分显示,要求只显示title键和tags键,并将title键改为Title

clipboard

①、$project 字符串处理

在$project中我们可以通过MongoDB的字符串操作符对投影的内容做字符串处理

查询test集合,将数组中的内容拆分显示,将title中的值转换为小写并命名为New_Title,

将tags的值转换为大写并命名为NEW_Tags

clipboard

查询test集合,将数组中的内容拆分显示。将title和tags字段的值拼接成一个完整的字符串

并在Title_Tags字段中显示

clipboard

查询test集合,将数组中的内容拆分显示。只显示title字段的前三个字符,并命名为Title_Prefix

clipboard

②、$project - 算数运算

在$project中我们可以通过MongoDB的算数运算符对投影的内容做运算处理

查询test集合中的数据,显示title和size字段,为size字段做+1操作,并显示为New_Size

clipboard

查询test集合中的数据,显示title和size字段,为size字段做-1操作,并显示为New_Size

clipboard

③、$project - 日期处理

MongoDB中的日期处理

插入当前时间:db.test.insert({date:new Date()})

MongoDB中的时间会比系统时间少8个小时。因为他的时间是UTC时间,而中国的时间是东八区,比UTC快8个小时,所以会比当前时间少8个小时

clipboard

插入指定日期

db.test.insert({title:new Date("2018-05-01T14:20:23Z")})

db.test.insert({title:ISODate("2019-06-01T14:20:23Z")})

查询时间

db.test.find({time:{$eq:ISODate("2021-07-08T13:01:27.535Z")}})

处理年、月、日

向test集合中插入一个文档 {name:"admin",birth:new Date("1995-05-01T13:30:00Z")}

clipboard

clipboard

显示小时、分钟、秒、毫秒

clipboard

显示星期、全年的第几周、全年的第几天

clipboard

自定义日期格式

clipboard

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐