MongoDB聚合查询

在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

posted @   青岑  阅读(340)  评论(1编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2020-07-09 Spring 注解版-事务实现
点击右上角即可分享
微信分享提示
主题色彩