定义
根据指定的排序顺序返回窗口内的顶部元素。
注意
消歧
本页介绍了用作窗口函数的 $top。您还可以在其他上下文中使用 $top:
$top (expression operator),根据指定的排序顺序返回大量的顶部元素。$top (accumulator),根据指定的排序顺序返回群组内的顶部元素。
语法
{ $setWindowFields: { ... output: { <field>: { $top: { sortBy: { <field1>: <sort order>, <field2>: <sort order> ... }, output: <expression> } } } } }
字段 | 必要性 | 说明 |
|---|---|---|
sortBy | 必需 | 定义窗口内元素的排名顺序,语法类似于 |
输出 | 必需 | 指定窗口中每个元素的输出。可以是任何表达式。 |
行为
$top窗口函数对 null 值和缺失值有以下行为:
$top不筛选空值。$top将缺失值转换为空。
例子
本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
隔着窗子寻找每年收视率最高的电影
此示例使用 $top 作为窗口函数,为每个电影文档识别当年收视率最高的电影。数据集经过筛选,仅包含 1980–1982 的 PG 级家庭电影。
db.movies.aggregate( [ { $match: { year: { $in: [ 1980, 1981, 1982 ] }, "imdb.rating": { $exists: true, $ne: null }, genres: "Family", rated: "PG" } }, { $setWindowFields: { partitionBy: "$year", output: { highestRatedInYear: { $top: { output: { title: "$title", rating: "$imdb.rating" }, sortBy: { "imdb.rating": -1 } }, window: { documents: [ "unbounded", "unbounded" ] } } } } }, { $project: { _id: 0, title: 1, year: 1, rating: "$imdb.rating", highestRatedInYear: 1 } }, { $limit: 10 } ] )
在本例中:
$match阶段筛选 1980-1982 之间的 PG 级家庭电影,以生成一个小型且集中的结果设立。$setWindowFields按year对文档进行分区。$top返回每个分区中评分最高的电影作为包含title和rating字段的嵌入式文档。$project在输出中仅包含title、year、rating和highestRatedInYear字段。$limit将输出限制为 10 文档。
此方法会保留所有单独的电影文档,并包含对每年表现最佳的电影的引用。