对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

$firstN(累加器运算符)

$firstN

返回群组中前 n 个元素的聚合。仅当分组阶段的输入数据具有已定义的排序顺序时,结果才有意义。如果群组包含的元素少于 n 个,$firstN 将返回群组中的所有元素。

$firstN累加器可在以下阶段使用:

注意

消歧

本页描述了用作累加器时的 $firstN。累加器返回单个聚合值,例如一群组输入文档的总和、最大值或最小值。

您还可以在其他上下文中使用 $firstN:

{
$firstN:
{
input: <expression>,
n: <expression>
}
}
字段
类型
说明

input

表达式(expression)

对输入群组中的每个文档评估 input表达式,并保留前 n 结果。

n

表达式(expression)

$firstN 从群组中返回的元素数量。有关根据群组键动态设置 n 的示例,请参阅根据组键设置 n。

  • $firstN 不筛选空值。

  • $firstN 将缺失值转换为空。

$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 的值。在此示例中,$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 电影。

给本页内容打分