MongoDB分组查询按指定字段分组统计,聚合查询通过多个阶段流水线处理数据,支持单多字段分组、条件筛选、分页排序,以及求和、平均值、最大值、最小值、首尾取值、拼接等聚合操作,覆盖日常数据统计需求。
在MongoDB中,实现数据的分组与聚合操作主要依赖两种方式:分组查询(Group by)和聚合查询(Aggregation)。聚合查询凭借其强大的灵活性,能够完成平均值、求和、最大值、最小值等统计计算,以及更复杂的数据转换和分析。通过合理组合不同的聚合阶段,可以高效处理各类业务需求。
简要区分:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
分组查询(Group by):按指定字段对文档进行分组,并计算每个分组的统计信息,语法相对简洁。
聚合查询(Aggregation):功能更强大,通过多个阶段(Stage)对数据进行流水线式处理,灵活适应多种复杂场景。
分组后仅保留分组字段,其他字段不会出现。_id为固定写法,后面指定要分组的字段名,例如userid。
# 类比SQL:select userid from test group by userid
db.test.aggregate({"$group":{"_id":"$userid"}})
效果:

多个字段分组时,需要为每个字段指定别名,_id内嵌套对象定义字段映射关系。
# 类比SQL:select userid, articleid from test group by userid, articleid
db.test.aggregate({"$group":{"_id":{"userid":"$userid","articleid":"$articleid"}}})
效果:

$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}}})
效果:

使用$limit和$skip控制分组数量,用法直观:
db.test.aggregate(
{"$group":{"_id":"$userid"}},
{"$skip":1},
{"$limit":2})
聚合操作包括$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"}
]);
按userid分组,对price求和:
db.test.aggregate({"$group":{"_id":"$userid","total":{"$sum":"$price"}}})

$sum:1表示每个文档贡献一个计数:
db.test.aggregate({"$group":{"_id":"$userid","total":{"$sum":1}}})
效果:

可分别求平均值、最大值、最小值,也可同时获取:
db.test.aggregate({"$group":{"_id":"$userid","a vg":{"$a vg":"$price"},"max":{"$max":"$price"},"min":{"$min":"$price"}}})
效果:

组合求和、平均值等,一次计算多个统计量:
db.test.aggregate({"$group":{"_id":"$userid","total":{"$sum":"$price"},"a vg":{"$a vg":"$price"}}})
效果:

对聚合结果的别名进行排序,$sort中1表示升序,-1表示降序:
# 先按userid降序,再按a vg升序
db.test.aggregate(
{"$group":{"_id":"$userid","a vg":{"$a vg":"$price"}}},
{"$sort":{"a vg":1}},
{"$sort":{"_id":-1}})
效果:

$first取分组内第一个元素,$last取最后一个:
db.test.aggregate({"$group":{"_id":"$userid","prices":{"$first":"$price"}}})
效果:

相当于SQL中的GROUP_CONCAT。
$push:元素可重复。$addToSet:元素不可重复(自动去重)。两种方式将分组后的数据拼成数组:
db.test.aggregate({"$group":{"_id":"$userid","names":{"$push":"$price"}}})
效果:

以上涵盖了MongoDB分组与聚合查询的主要用法,包括单字段分组、多字段分组、条件筛选、分页排序,以及各种聚合函数及其组合方式。这些操作基本覆盖了日常开发中常见的数据统计场景,掌握这些语法可有效提升数据处理效率。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述