MST
星途 面试题库

面试题:MongoDB聚合框架中$group可调参数的深度应用

在MongoDB聚合框架里,$group操作符用于对文档进行分组。请说明$group操作符中 _id 字段作为分组依据的原理,以及除了常见的计数、求和等聚合函数外,$group还有哪些不常用但在特定场景下非常有用的可调参数,并举例阐述这些参数如何在复杂数据分析场景中发挥作用。
38.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试
  1. _id字段作为分组依据的原理
    • 在MongoDB的$group操作符中,_id字段定义了分组的键。它会根据_id的值将集合中的文档进行分组。如果_id的值相同,这些文档就会被分到同一组。例如,如果_id设置为某个字段名,那么具有相同该字段值的文档就会在同一组。_id可以是一个字符串、对象或者表达式。当使用表达式时,MongoDB会根据表达式的计算结果对文档进行分组。例如,{ $group: { _id: "$category", count: { $sum: 1 } } },这里根据category字段的值对文档分组,category值相同的文档会被分在一组,并对每组文档进行计数。
  2. 不常用但有用的可调参数及示例
    • $push
      • 作用:将每个文档中的指定字段值添加到一个数组中,这个数组属于分组后的文档。
      • 示例:假设我们有一个销售记录集合,记录了不同地区不同产品的销售额。我们想知道每个地区都销售了哪些产品。
      [
        {
          $group: {
            _id: "$region",
            products: { $push: "$product" }
          }
        }
      ]
      
      • 在这个例子中,根据region字段分组,对于每个地区,$push操作符会把该地区销售的所有产品名称添加到products数组中。
    • $first
      • 作用:返回分组内第一个文档的指定字段值。通常在文档已经按照某个字段排序后使用,可获取分组内按照排序规则的第一个值。
      • 示例:假设有一个博客文章集合,每个文章有发布时间字段。我们想知道每个作者最早发布的文章标题。
      [
        {
          $sort: {
            publishDate: 1
          }
        },
        {
          $group: {
            _id: "$author",
            firstArticleTitle: { $first: "$title" }
          }
        }
      ]
      
      • 首先通过$sort按发布时间升序排序,然后在$group中,$first操作符获取每个作者分组内最早发布文章的标题。
    • $last
      • 作用:与$first相反,返回分组内最后一个文档的指定字段值。同样常与$sort结合使用,获取分组内按照排序规则的最后一个值。
      • 示例:还是博客文章集合,这次想知道每个作者最新发布的文章标题。
      [
        {
          $sort: {
            publishDate: -1
          }
        },
        {
          $group: {
            _id: "$author",
            lastArticleTitle: { $last: "$title" }
          }
        }
      ]
      
      • 先按发布时间降序排序,$last操作符在$group中获取每个作者分组内最新发布文章的标题。