SequoiaDB 简介
安装部署
数据库实例
分布式引擎
SAC 管控中心
参考手册
常见问题及解答(FAQ)
版本信息
{ $group: { _id: "$分组字段名", 显示字段名: { 聚集函数: "$字段名" }, [ 显示字段名2: { 聚集函数: "$字段名" }, ... ] } }
$group 实现对结果集的分组,类似 SQL 中的 group by 语句。
首先指定分组键(_id),通过 _id 来标识分组字段,分组字段可以是单个,也可以是多个。
单个分组键
{ _id: "$field" }
多个分组键
{ _id: { field1: "$field1", field2: "$field2", ... } }
Note:
$group 是按照分组键指定的字段对结果集进行分组。如果不指定分组键,结果集不会进行分组,会返回所有的记录。如果分组键指定的字段不存在,默认返回集合的第一条记录。
在集合 sample.employee 中插入以下数据:
> db.sample.employee.insert( [ { name: "Tom", score: 95, major: "Electronic Commerce", college: "College of Economics Finance" }, { name: "Alice", score: 90, major: "Accounting Profession", college: "College of Economics Finance" }, { name: "Ben", score: 85, major: "Financial Management", college: "College of Economics Finance" }, { name: "Jack", score: 80, major: "Software Engineering", college: "College of Computer Science" }, {name: "Jerry", score: 75, major: "Network Engineering", college: "College of Computer Science" }, { name: "Smith", score: 70, major: "Information Engineering", college: "College of Computer Science" } ] )
从集合 sample.employee 中读取记录,并按 college 字段进行分组,取每个分组第一条记录的 college 字段,输出字段名为 College;每个分组中的 score 字段值求平均值,输出字段名为“Avg_score”
> db.sample.employee.aggregate( { $group: { _id: "$college", Avg_score: { $avg: "$score" }, College: { $first: "$college" } } } )
输出结果如下:
{ "Avg_score": 75, "College": "College of Computer Science" } { "Avg_score": 90, "College": "College of Economics Finance" }
函数名 | 描述 |
---|---|
$addtoset | 将字段添加到数组中,相同的字段值只会添加一次 |
$first | 取分组中第一条记录中的字段值 |
$last | 取分组中最后一条记录中的字段值 |
$max | 取分组中指定字段的最大值 |
$min | 取分组中指定字段的最小值 |
$avg | 取分组中指定字段值的平均值 |
$push | 将所有字段添加到数组中,即使数组中已经存在相同的字段值,也继续添加 |
$sum | 取分组中指定字段值的总和 |
$count | 对记录分组后,返回表所有的记录条数 |
记录分组后,使用 $addtoset 将指定字段值添加到数组中,相同的字段值只会添加一次。对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,按 college 字段值进行分组,并通过 $first 获取每个分组第一条记录的 college 字段,输出字段名为 College;使用 $addtoset 把 major 字段值放入数组中返回,数组名为“addtoset_major”
> db.sample.employee.aggregate( { $group: { _id: "$college", College: { $first: "$college" }, addtoset_major: { $addtoset: "$major" } } } )
输出结果如下:
{ "College": "College of Computer Science", "addtoset_major": [ "Software Engineering", "Network Engineering", "Information Engineering" ] } { "College": "College of Economics Finance", "addtoset_major": [ "Electronic Commerce", "Accounting Profession", "Financial Management" ] }
记录分组后,用 $count 取出分组所包含的总记录条数。
示例
从集合 sample.employee 中读取记录,返回表中包含有 college 字段的所有记录的数量
> db.sample.employee.aggregate( { $group: { Total: { $count: "$college" } } } )
输出结果如下:
{ "Total": 6 }
记录分组后,取分组中第一条记录指定的字段值,对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,对记录按 college 字段分组,取每个分组中第一条记录的 college 字段值和 name 字段值,输出字段名分别为 College 和 Name
> db.sample.employee.aggregate( { $group: { _id: "$college", College: { $first: "$college" }, Name: { $first: "$name" } } } )
输出结果如下:
{ "College": "College of Computer Science", "Name": "Jack" } { "College": "College of Economics Finance", "Name": "Tom" }
记录分组后,取分组中指定字段的平均值返回,对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,并按 college 字段进行分组,取每个分组的第一条记录的 college 字段,输出字段名为 College;每个分组中的 score 字段值求平均值,输出字段名为“Avg_score”
> db.sample.employee.aggregate( { $group: { _id: "$college", Avg_score: { $avg: "$score" }, College: { $first: "$college" } } } )
输出结果如下:
{ "Avg_score": 75, "College": "College of Computer Science" } { "Avg_score": 90, "College": "College of Economics Finance" }
记录分组后,取分组中指定字段的最大值返回,对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,按 college 字段分组,使用 $max 返回每个分组中 score 字段值的最大值,输出字段名为“Max_score”,并输出第一条记录的 name 字段值和 college 字段值,输出字段名为“Name”和“College”
> db.sample.employee.aggregate( { $group: { _id: "$college", max_score: { $max: "$score" }, College: { $first: "$college" }, Name: { $first: "$name" } } } )
输出结果如下:
{ "Max_score": 80, "College": "College of Computer Science", "Name": "Jack" } { "Max_score": 95, "College": "College of Economics Finance", "Name": "Tom" }
记录分组后,取分组中指定字段的最小值返回,对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,按 college 字段分组,使用 $min 返回每个分组中 score 字段值的最小值,输出字段名为“Min_score”,并输出第一条记录的 name 字段值和 college 字段值,输出字段名为“Name”和“College”
> db.sample.employee.aggregate( { $group: { _id: "$college", Min_score: { $min: "$score" }, College: { $first: "$college" }, Name: { $last: "$name" } } } )
输出结果如下:
{ "Min_score": 70, "College": "College of Computer Science", "Name": "Smith" } { "Min_score": 85, "College": "College of Economics Finance", "Name": "Ben" }
记录分组后,取分组中最后一条记录指定的字段值,对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,对记录按 college 字段分组,使用 $last 取每个分组中最后一条记录的 name 字段值,输出字段名为“Name”,使用 $addtoset 把 major 字段值放入数组中返回,数组名为“Major”
> db.sample.employee.aggregate( { $group: { _id: "$college", Major: { $addtoset: "$major" }, Name: { $last: "$name" } } } )
输出结果如下:
{ "Major": [ "Software Engineering", "Network Engineering", "Information Engineering" ], "Name": "Smith" } { "Major": [ "Electronic Commerce", "Accounting Profession", "Financial Management" ], "Name": "Ben" }
记录分组后,使用 $push 将指定字段值添加到数组中,即使数组中已经存在相同的值,也可以继续添加。对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,对记录按 college 字段值进行分组,每个分组 score 字段值使用 $push 放入数组中返回,数组名为“push_score”
> db.sample.employee.aggregate( { $group: { _id: "$college", College: { $first: "$college" }, push_score: { $push: "$score" } } } )
输出结果如下:
{ "College": "College of Computer Science", "push_score": [ 80, 75, 70 ] } { "College": "College of Economics Finance", "push_score": [ 95, 90, 85 ] }
记录分组后,返回每个分组中指定字段值的总和,对嵌套对象使用点操作符(.)引用字段名。
示例
从集合 sample.employee 中读取记录,对记录按 college 字段分组,使用 $sum 返回每个分组中 score 字段值的总和,输出字段名为“sum_score”;使用 $first 取每个分组中第一条记录的 college 字段值,输出字段名为“College”
> db.sample.employee.aggregate( { $group: { _id: "$college", sum_score: { $sum: "$score" }, College: { $first: "$college" } } } )
输出结果如下:
{ "sum_score": 225, "College": "College of Computer Science" } { "sum_score": 270, "College": "College of Economics Finance" }