MongoDB不像关系型数据库,普通的查询不支持汇总,要进行复杂的分组汇总,需要使用聚合管道,$group可以说是MongoDB聚合管道进行数据分析最常用的一个阶段。该阶段根据分组键值(组键)把文档分成若干组,每个唯一的键值对应一个文档。组键通常是一个或多个字段,也可以是表达式的结果。$group阶段输出的结果中,_id字段的值就是组键的值,输出文档中还可以包含汇总表达式的字段,汇总表达式的功能非常丰富,下面的列表会简单介绍,具体的使用方法可以参考详细说明。
$group的语法
{
$group:
{
_id: <expression>, // 组键,就是分组的键值字段或表达式
<field1>: {
<accumulator1> : <expression1> },
...
}
}
字段说明:
| 字段 | 说明 |
|---|---|
| _id | 不可省略,通过_id表达式指定分组的依据,如果直接指定_id的值为null或常量,则把全部的输入文档汇总后返回一个文档 |
| field | 可选,汇总表达式计算的结果 |
| _id和field可以是任何合法的表达式。 |
分组汇总操作符
分组汇总操作符比较多,功能丰富且强大,这里简要介绍其用途,详细的用法后续再专文介绍。
| 操作符 | 用途介绍 |
|---|---|
$accumulator |
返回累加结果 |
$addToSet |
把分组中不重复的表达式的值作为数组返回,注意数组的元素无序的,类似分组内的distinct |
$avg |
返回数值的平均值。非数值会被忽略 |
$bottom |
按照指定的顺序返回分组中最后一个元素 |
$bottomN |
按照指定的顺序返回分组中最后N个元素字段的集合,如果分组元素数量小于N,则返回全部 |
$count |
返回分组内的元素数量 |
$first |
返回分组内第一个元素表达式的结果 |
$firstN |
返回分组内前n个元素的聚合。只有文档有序时才有意义 |
$last |
返回分组中最后一个文档的表达式的结果 |
$lastN |
返回分组内最后n个元素的聚合。只有文档有序时才有意义 |
$max |
返回每个分组表达式值的最大值 |
$maxN |
返回分组内最大的n个元素的集合 |
$median |
返回分组中的中位数 |
$mergeObjects |
返回分组合并后的文档 |
$min |
返回分组内表达式的最小值 |
$percentile |
返回与指定百分位数值相对应的值的数组 |
$push |
返回每个分组表达式值的数组 |
$stdDevPop |
返回标准差 |
$stdDevSamp |
返回样本标准差 |
$sum |
返回合计值,忽略空值 |
$top |
根据指定的顺序返回组内最前面的元素 |
$topN |
根据指定的顺序返回组内前N个元素的聚合 |
注意
$group使用内存不能超过100M,超过会报错。如果想要处理更多数据或者少用一些内存,可使用allowDiskUse选项把数据写入临时文件。- 当使用
$first、$last等操作符时,可以考虑在参与排序的分组字段上添加索引,某些情况下,这些操作可以使用索引快速定位到相应的记录。
一些例子
统计数量
创建并插入数据:
db.sales.insertMany([
{
"_id" : 1, "item" : "abc", "price" : Decimal128("10"), "quantity" : Int32("2"), "date" : ISODate("2014-03-01T08:00:00Z") },
{
"_id" : 2, "item" : "jkl", "price" : Decimal128("20"), "quantity" : Int32("1"), "date" : ISODate("2014-03-01T09:00:00Z") },
{
"_id" : 3, "item" : "xyz", "price" : Decimal128("5"), "quantity" : Int32( "10"), "date" : ISODate("2014-03-15T09:00:00Z") },
{
"_id" : 4, "item" : "xyz", "price" : Decimal128("5"), "quantity" : Int32("20") , "date" : ISODate("2014-04-04T11:21:39.736Z") },
{
"_id" : 5, "item" : "abc", "price" : Decimal128("10"), "quantity" : Int32("10") , "date" : ISODate("2014-04-04T21:23:13.331Z") },
{
"_id" : 6, "item" : "def", "price" : Decimal128("7.5"), "quantity": Int32("5" )

本文介绍了MongoDB中的$group聚合管道阶段,用于复杂的数据分组和汇总,包括组键、汇总操作符如$sum、$avg、$max等的用法。通过实例展示了如何统计数量、按条件分组、计算总计和平均值,以及数据透视等操作。
最低0.47元/天 解锁文章
959

被折叠的 条评论
为什么被折叠?



