定义
返回群组中前 n 个元素的聚合。仅当分组阶段的输入数据具有已定义的排序顺序时,结果才有意义。如果群组包含的元素少于 n 个,$firstN 将返回群组中的所有元素。
$firstN累加器可在以下阶段使用:
注意
消歧
本页描述了用作累加器时的 $firstN。累加器返回单个聚合值,例如一群组输入文档的总和、最大值或最小值。
您还可以在其他上下文中使用 $firstN:
$firstN (expression),它会从大量的开头返回指定数量的元素。$firstN (window function),在$setWindowFields阶段用于返回特定窗口中文档的前n值。
语法
{ $firstN: { input: <expression>, n: <expression> } }
选项
字段 | 类型 | 说明 |
|---|---|---|
| 表达式(expression) | 对输入群组中的每个文档评估 |
| 表达式(expression) |
|
行为
Null 和缺失值
$firstN不筛选空值。$firstN将缺失值转换为空。
$firstN 和 $topN 的比较
$firstN 和 $topN 累加器都可以实现类似的结果。
一般来说:
如果进入
$group的文档已经排序,则应使用$firstN。如果您要排序并选择顶部的
n元素,则可以使用$topN通过一个累加器完成这两项任务。
示例
本页上的示例使用 sample_mflix示例数据集中的 movies集合。要学习;了解如何将示例数据集加载到MongoDB 部署中,请参阅将样本数据导入到Atlas部署中。
查找单一类型的前三部电影
您可以使用 $firstN累加器查找单个类型的前三部电影。
db.movies.aggregate( [ { $match: { genres: "Horror" } }, { $sort: { year: 1 } }, { $group: { _id: "Horror", firstThreeMovies: { $firstN: { input: [ "$title", "$year" ], n: 3 } } } } ] )
上述管道:
使用
$match过滤Horror包含在genres大量中的电影结果。按
year升序对结果进行排序。将所有生成的文档分组成一个群组。
指定使用
input : ["$title", "$year"]为$firstN输入的字段。使用
$firstN返回具有n: 3的Horror类型的前三个文档。
查找多种类型的前三部电影
您可以使用 $firstN累加器查找每个类型中的前 n 个输入字段。
db.movies.aggregate( [ { $unwind: "$genres" }, { $sort: { year: 1 } }, { $group: { _id: "$genres", movies: { $firstN: { input: [ "$title", "$year" ], n: 3 } } } }, { $sort: { _id: 1 } }, { $limit: 5 } ] )
上述管道:
使用
$unwind为genres大量中的每个类型创建单独的文档。按
year升序对结果进行排序。使用
$group按genres对结果进行分组。使用
$firstN返回每个n: 3类型的前三个文档。指定使用
input : ["$title", "$year"]为$firstN输入的字段。将输出限制为五个文档,以提高可读性。
根据组键设置 n
您可以根据群组键动态分配 n 的值。在此示例中,$cond表达式使用 rated字段来更改 n 的值:
db.movies.aggregate([ { $match: { rated: { $in: ["G", "PG", "PG-13", "R"] } } }, { $sort: { title: 1 } }, { $group: { _id: {"rated": "$rated"}, movies: { $firstN: { input: "$title", n: { $cond: { if: { $eq: ["$rated", "PG"] }, then: 3, else: 1 } } } } } } ] )
上述管道:
筛选评级为
G、PG、PG-13或R的电影。按
title的字母顺序对结果进行排序。按
rated(电影评分)对电影进行分组。使用
$cond表达式为PG级电影返回3电影,为所有其他分级返回1电影。
在输出中,PG 评分返回 3 电影,而 G、PG-13 和 R 评分均返回 1 电影。