注册

详解MongoDB的group()函数:对集合中的文档进行分组

当使用 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_iddate,查询条件为空,聚合计算的初始值为 { 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() 函数的作用与使用方法的完整攻略。