首页 > 数据库 >MongoDB分组查询与聚合查询实战实例

MongoDB分组查询与聚合查询实战实例

来源:互联网 2026-07-25 08:51:08

MongoDB分组查询按指定字段分组统计,聚合查询通过多个阶段流水线处理数据,支持单多字段分组、条件筛选、分页排序,以及求和、平均值、最大值、最小值、首尾取值、拼接等聚合操作,覆盖日常数据统计需求。

前言

在MongoDB中,实现数据的分组与聚合操作主要依赖两种方式:分组查询(Group by)和聚合查询(Aggregation)。聚合查询凭借其强大的灵活性,能够完成平均值、求和、最大值、最小值等统计计算,以及更复杂的数据转换和分析。通过合理组合不同的聚合阶段,可以高效处理各类业务需求。

简要区分:

长期稳定更新的攒劲资源: >>>点此立即查看<<<

分组查询(Group by):按指定字段对文档进行分组,并计算每个分组的统计信息,语法相对简洁。

聚合查询(Aggregation):功能更强大,通过多个阶段(Stage)对数据进行流水线式处理,灵活适应多种复杂场景。

1、单一字段分组

分组后仅保留分组字段,其他字段不会出现。_id为固定写法,后面指定要分组的字段名,例如userid

# 类比SQL:select userid from test group by userid
db.test.aggregate({"$group":{"_id":"$userid"}})

效果:

MongoDB分组查询与聚合查询实战实例

2、多字段分组

多个字段分组时,需要为每个字段指定别名,_id内嵌套对象定义字段映射关系。

# 类比SQL:select userid, articleid from test group by userid, articleid
db.test.aggregate({"$group":{"_id":{"userid":"$userid","articleid":"$articleid"}}})

效果:

MongoDB分组查询与聚合查询实战实例

3、条件匹配分组

$match用于条件筛选,放在$group之前相当于SQL的WHERE,放在之后相当于HA VING。常见场景如下:

# 场景一:先筛选再分组
# 类比SQL:select userid from test where userid in('1','2') group by userid
db.test.aggregate(
    {"$match":{"userid":{"$in":["1","2"]}}},
    {"$group":{"_id":"$userid"}})

# 场景二:多字段分组+条件
db.test.aggregate(
    {"$match":{"userid":{"$in":["1","2"]}}},
    {"$group":{"_id":{"userid":"$userid","articleid":"$articleid"}}})

# 场景三:先分组过滤,再分组后条件(HA VING)
# 类比SQL:select userid, a vg(price) as a vg from test where userid > '10' group by userid ha ving a vg > 35
db.test.aggregate(
    {"$match":{"userid":{"$gt":"10"}}},
    {"$group":{"_id":"$userid",'a vg':{"$a vg":"$price"}}},
    {"$match":{"a vg":{"$gt":35}}})

效果:

MongoDB分组查询与聚合查询实战实例

4、分组分页排序

使用$limit$skip控制分组数量,用法直观:

db.test.aggregate(
    {"$group":{"_id":"$userid"}},
    {"$skip":1},
    {"$limit":2})

5、聚合分组

聚合操作包括$sum$a vg$max$min$first$last等,每个聚合结果需起别名,并可结合条件、排序等环节使用。

先准备测试数据:

db.test.insert([
    {"articleid":"1","price":200,"userid":"5"},
    {"articleid":"2","price":300,"userid":"5"},
    {"articleid":"3","price":400,"userid":"5"},
    {"articleid":"1","price":200,"userid":"6"},
    {"articleid":"2","price":300,"userid":"7"}
]);

5.1、sum聚合——求数值总和

userid分组,对price求和:

db.test.aggregate({"$group":{"_id":"$userid","total":{"$sum":"$price"}}})

MongoDB分组查询与聚合查询实战实例

5.2、sum聚合——求分组后数量

$sum:1表示每个文档贡献一个计数:

db.test.aggregate({"$group":{"_id":"$userid","total":{"$sum":1}}})

效果:

MongoDB分组查询与聚合查询实战实例

5.3、a vg、max、min聚合

可分别求平均值、最大值、最小值,也可同时获取:

db.test.aggregate({"$group":{"_id":"$userid","a vg":{"$a vg":"$price"},"max":{"$max":"$price"},"min":{"$min":"$price"}}})

效果:

MongoDB分组查询与聚合查询实战实例

5.4、复合聚合

组合求和、平均值等,一次计算多个统计量:

db.test.aggregate({"$group":{"_id":"$userid","total":{"$sum":"$price"},"a vg":{"$a vg":"$price"}}})

效果:

MongoDB分组查询与聚合查询实战实例

5.5、聚合分组排序

对聚合结果的别名进行排序,$sort中1表示升序,-1表示降序:

# 先按userid降序,再按a vg升序
db.test.aggregate(
    {"$group":{"_id":"$userid","a vg":{"$a vg":"$price"}}},
    {"$sort":{"a vg":1}},
    {"$sort":{"_id":-1}})

效果:

MongoDB分组查询与聚合查询实战实例

5.6、首尾取值聚合

$first取分组内第一个元素,$last取最后一个:

db.test.aggregate({"$group":{"_id":"$userid","prices":{"$first":"$price"}}})

效果:

MongoDB分组查询与聚合查询实战实例

5.7、聚合分组拼接

相当于SQL中的GROUP_CONCAT

  • $push:元素可重复。
  • $addToSet:元素不可重复(自动去重)。

两种方式将分组后的数据拼成数组:

db.test.aggregate({"$group":{"_id":"$userid","names":{"$push":"$price"}}})

效果:

MongoDB分组查询与聚合查询实战实例

总结

以上涵盖了MongoDB分组与聚合查询的主要用法,包括单字段分组、多字段分组、条件筛选、分页排序,以及各种聚合函数及其组合方式。这些操作基本覆盖了日常开发中常见的数据统计场景,掌握这些语法可有效提升数据处理效率。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。