当使用 MongoDB 查询文档时,我们常常需要将数据按照指定的条件进行分类或归纳,这个时候,group() 函数就是一种非常好的选择。
作用
group() 函数可以将符合条件的文档按照指定字段进行分组,然后对每个分组的文档进行聚合计算。比如可以统计每个用户的访问量、按年月统计销售额、按课程分类统计学生人数等。
使用方法
group() 函数的一般语法如下:
db.collection_name.group(
{
key: ..., // 分组字段
cond: ..., // 查询条件
initial: ..., // 聚合计算的初始值
reduce: ..., // 聚合计算
finalize: ... // 最终处理
}
)
其中,key 指定了进行分组的字段,cond 指定了需要筛选的文档,initial 指定了聚合计算的初始值,reduce 指定了具体的聚合计算方法,finalize 则指定了最终处理的方法。
下面我们通过两个实例进行详细讲解:
实例1
假如我们有一个用户访问记录的集合,包含以下字段:
user_id
:用户 ID;date
:访问时间,格式为 YYYY-MM-DD。
我们需要统计每个用户每天的访问量,可以使用以下代码实现:
db.visit_records.group({
key: {
user_id: 1,
date: 1
},
cond: {},
initial: {
count: 0
},
reduce: function(doc, prev) {
prev.count++;
},
finalize: function(prev) {}
})
在上面的代码中,我们指定了两个分组字段 user_id
和 date
,查询条件为空,聚合计算的初始值为 { count: 0 }
,reduce
函数通过遍历每个文档,统计了每个分组的数量。
实例2
接下来,再看一个按学校类型和地理位置分类统计学生人数的例子。假设现在有一个学生成绩的集合,包含以下字段:
school_type
:学校类型,包括重本、普本、专科;province
:省份;city
:城市;score
:成绩,范围为 0~100。
我们希望将成绩在 80 分以上的学生按照学校类型、省份和城市进行分组,并统计各组的学生数量。代码实现如下:
db.student_scores.group({
key: {
school_type: 1,
province: 1,
city: 1
},
cond: {
score: { $gte: 80 }
},
initial: {
count: 0
},
reduce: function(doc, prev) {
prev.count++;
},
finalize: function(prev) {}
})
在上述代码中,我们使用了一个条件 { score: { $gte: 80 } }
对符合条件的文档进行筛选,其他设置与实例 1 相同。执行后,就可以得到一个按照学校类型、省份和城市分组的学生记录,以及各组学生的数量信息。
以上就是 MongoDB 的 group() 函数的作用与使用方法的完整攻略。