面试题答案
一键面试- _id字段作为分组依据的原理:
- 在MongoDB的
$group
操作符中,_id
字段定义了分组的键。它会根据_id
的值将集合中的文档进行分组。如果_id
的值相同,这些文档就会被分到同一组。例如,如果_id
设置为某个字段名,那么具有相同该字段值的文档就会在同一组。_id
可以是一个字符串、对象或者表达式。当使用表达式时,MongoDB会根据表达式的计算结果对文档进行分组。例如,{ $group: { _id: "$category", count: { $sum: 1 } } }
,这里根据category
字段的值对文档分组,category
值相同的文档会被分在一组,并对每组文档进行计数。
- 在MongoDB的
- 不常用但有用的可调参数及示例:
- $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
中获取每个作者分组内最新发布文章的标题。
- 作用:与
- $push: