在MongoDB中我们可以通过aggregate()函数来完成一些聚合查询,aggregate()函数主要用于处理诸如统计,平均值,求和等,并返回计算后的数据结果
语法:
db.collection.aggregate([ { $group:{ id:{"$分组键名","$分组键名","$分组键名"....} 别名:{聚合运算:"$运算列"} } }, { 条件筛选:{键名:{运算条件:运算值}} } ])
常见的Mongo聚合操作和mysql的查询做对比
1、$sum求和
1)查询test集合中 一共有多少个文档
相当于sql语句 select count(*) as count form test
db.test.aggregate([ { $group:{ _id:null, //null表示不作任何分组 count:{$sum:1} } } ])
2)查询test集合中所有size键中值的总和
相当于sql语句:select count(size) as totalSize from test
db.test.aggregate([ { $group:{ _id:null, count:{$sum:"$size"} //$size表示文档中size的值 } } ])
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的值 } } ])
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}}} ])
2)查询test集合,根据title分组计算出每组size的总和,并过滤掉小于等于200的文档
相当于sql语句:select title as _id,sum(size) as totalSize group by title having totalSize > 200
3)最大值 $max
查询dev集合中size最大的文档
4)$min 最小值
查询dev集合中size最小的文档
5)$avg 平均值
查询dev集合中size平均值
6)$push 统计结果返回数组
查询dev集合,按照size分组并返回title,如果size相同则使用数组返回他们的title
7)$unwind 对数组字段进行拆分
8)管道操作
什么是管道操作:
管道在Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理
管道操作符:$match,$group,$sort $limit $skip $unwind
9)$project 聚合投影约束
查询test集合,将数组中的内容拆分显示,并且只显示title和tags键
查询test集合,将数组中的内容拆分显示,要求只显示title键和tags键,并将title键改为Title
①、$project 字符串处理
在$project中我们可以通过MongoDB的字符串操作符对投影的内容做字符串处理
查询test集合,将数组中的内容拆分显示,将title中的值转换为小写并命名为New_Title,
将tags的值转换为大写并命名为NEW_Tags
查询test集合,将数组中的内容拆分显示。将title和tags字段的值拼接成一个完整的字符串
并在Title_Tags字段中显示
查询test集合,将数组中的内容拆分显示。只显示title字段的前三个字符,并命名为Title_Prefix
②、$project - 算数运算
在$project中我们可以通过MongoDB的算数运算符对投影的内容做运算处理
查询test集合中的数据,显示title和size字段,为size字段做+1操作,并显示为New_Size
查询test集合中的数据,显示title和size字段,为size字段做-1操作,并显示为New_Size
③、$project - 日期处理
MongoDB中的日期处理
插入当前时间:db.test.insert({date:new Date()})
MongoDB中的时间会比系统时间少8个小时。因为他的时间是UTC时间,而中国的时间是东八区,比UTC快8个小时,所以会比当前时间少8个小时
插入指定日期
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")}
显示小时、分钟、秒、毫秒
显示星期、全年的第几周、全年的第几天
自定义日期格式