对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

$first(累加器操作符)

$first

返回一组文档中第一个文档的表达式结果。仅当文档按定义的顺序排列时才有意义。

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

注意

消歧

本页介绍了 $first 用作 累加器 时的情况。累加器对一组输入文档返回单个聚合值,如总和、最大值或最小值。

您还可以在这些其他上下文中使用 $first:

{ $first: <expression> }

要在分组阶段为 $first 定义文档顺序,请在前面添加一个 $sort 阶段。

群组中的文档可能缺失字段。$first 如下处理缺失值:

  • 如果前一个管道阶段没有文档,则$group阶段将不返回任何内容。

  • 如果 $first 累加器正在处理的字段缺失,则 $first 返回 null。

示例,考虑在 badData 集合中的以下文档,其中某些文档缺少字段:

db.badData.insertMany( [
{ "_id": 1, "price": 6, "quantity": 6 },
{ "_id": 2, "item": "album", "price": 5, "quantity": 5 },
{ "_id": 7, "item": "tape", "price": 6, "quantity": 6 },
{ "_id": 8, "price": 5, "quantity": 5 },
{ "_id": 9, "item": "album", "price": 3, "quantity": '' },
{ "_id": 10, "item": "tape", "price": 3, "quantity": 4 },
{ "_id": 12, "item": "cd", "price": 7 }
] )

查询 badData 集合,在 item 字段对输出进行分组:

db.badData.aggregate( [
{ $sort: { item: 1, price: 1 } },
{
$group: {
_id: "$item",
inStock: { $first: "$quantity" }
}
}
] )

$first 从每个输出群组中选择第一个文档。缺少 item 字段的文档与 _id 字段的 null 值分组唯一。当累加器字段(在本示例中为 quantity)缺失时,$first 会返回 null。

本页上的示例使用来自 sample_mflix 数据集的数据。有关如何将此数据集加载到您的自管理 MongoDB 部署中的详细信息,请参阅 加载示例数据集。如果您对示例数据库进行了任何修改,您可能需要删除并重新创建数据库,才能运行此页面上的示例。

以下示例按年份和片名对电影进行排序,然后按类型对其进行分组,以查找每个类型中发行时间最早的电影:

db.movies.aggregate( [
{ $sort: { year: 1, title: 1 } },
{ $unwind: "$genres" },
{
$group: {
_id: "$genres",
firstMovieTitle: { $first: "$title" },
firstMovieYear: { $first: "$year" }
}
},
{ $sort: { _id: 1 } },
{ $limit: 5 }
] )

在前面的管道中:

  • $sort 按 year 升序排列电影,然后按 title 字母顺序排列。

  • $unwind 为 genres 数组中的每个类别创建单独的文档,并保持上一个阶段建立的排序顺序。

  • 对于每种类型,$group 与 $first 结合的返回第一部电影的 title 和 year (按年份从早到晚排序,然后按电影名称字母顺序排序)。

  • 第二个 $sort 按类型对结果进行字母顺序排序。

  • $limit 将输出限制为 5 类型。

给本页内容打分