对于 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 菜单

$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 类型。

给本页内容打分