前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库MongoDB-聚合查询

数据库MongoDB-聚合查询

作者头像
cwl_java
发布2021-02-04 10:59:41
7.8K0
发布2021-02-04 10:59:41
举报
文章被收录于专栏:cwl_Javacwl_Java

MongoDB 聚合查询

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

语法格式:

代码语言:javascript
复制
db.COLLECTION_NAME.aggregate([{$group:{_id:"$分组键名","$分组键名",.....,别名:{聚合运算:"$运算列"}}},{条件筛选:{键名:{运算条件:运算值}}}])

常见的mongo的聚合操作和mysql的查询做类比

求和 - $sum

查询dev集合中一共有多少个文档。

相当于sql语句:SELECT count(*) AS count FROM c1

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:null,count:{$sum:1}}}])

$group:分组,代表聚合的分组条件

_id:分组的字段,是必须有的。相当于SQL分组语法group by column_name中的column_name部分。如果根据某字段的值分组,则定义为_id:’$字段名’。如果没有分组属性取值为null

count:返回结果字段名。可以自定义,类似SQL中的字段别名。

$sum:如果取值为1表示总条数,相当于每个document中都多个count属性,count取值为1,累加和就是总条数。如果 s u m 取 值 是 ‘ sum取值是‘ sum取值是‘field名’(要注意有单引号或双引号),表示对该field求累加和

取总和

sum取值必须是字符串类型,有双引号。age是属性名,前面必须有

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:null,totalAge:{$sum:"$age"}}}]);
分组后取总和

_id取值也是字符串类型,里面必须是属性名前面加上$

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:"$name",totalAge:{$sum:"$age"}}}]);
条件筛选 - $match

match和group同级操作符,需要写在两个条件中的。

写在$group前面

match写在group前面表示先过滤条件,在分组。

先查询出age大于等于5的文档对象,在按照name属性进行分组,计算age列总和

代码语言:javascript
复制
db.c1.aggregate([{$match:{age:{$gte:5}}},{$group:{_id:"$name",totalAge:{$sum:"$age"}}}]);

写在$group后面

match写在group后面表示分组后在设置条件。

分组后结果集只有_id和totalAge两个属性,所以在$match中只能对这个属性进行操作。

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:"$name",totalAge:{$sum:"$age"}}},{$match:{totalAge:{$gte:5}}}]);
最大值 - $max

$max可以计算最大值。

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:"$name",maxAge:{$max:"$age"}}}]);
最小值 - $min

$min可以计算最小值

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:"$name",minAge:{$min:"$age"}}}]);
平均值 - $avg

计算出不同姓名的平均年龄

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:"$name",avgAge:{$avg:"$age"}}}]);
统计结果返回数组 - $push

分组后按照分组数组进行合并,如果希望看到某个列合并之前的所有数据可以使用$push,把分组后同一组的所有值放到一个数组中

按照name进行分组,分组后把age的数据都放入到名称为allAge的数组中

代码语言:javascript
复制
db.c1.aggregate([{$group:{_id:"$name",allAge:{$push:"$age"}}}])

运行结果

在这里插入图片描述
在这里插入图片描述
数组字段拆分 - $unwind

$unwind会把数组列进行拆分,原来的document会根据数组属性值个数分为多个document。如果这个数组属性为空,对应document将不被显示(因为document没有数组属性)

正常数据:只有name为abc的hobby有数组类型值,且长度为3

在这里插入图片描述
在这里插入图片描述

执行下面命令后的效果

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
db.c1.aggregate([{$unwind:"$hobby"}]);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB 聚合查询
    • 求和 - $sum
      • 写在$group后面
      相关产品与服务
      云数据库 MongoDB
      腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档