定义
根据指定的排序顺序,返回特定窗口内的前 n 元素。
语法
{ $setWindowFields: { ... output: { <field>: { $topN: { n: <expression>, output: <expression>, sortBy: { <field1>: <sort order>, <field2>: <sort order>, ... } } } } } }
选项
字段 | 必要性 | 说明 |
|---|---|---|
| 必需 | 要返回的结果数。必须解析为正整数值。 如果窗口包含的元素少于 |
| 必需 | 确定窗口中每个文档的输出。可以是任何表达式。 |
| 必需 | 定义窗口内元素的排名顺序,语法类似于 |
行为
Null 和缺失值
$topN不筛选空值。$topN将缺失值转换为空。
例子
本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
在窗口中查找评分最高的三部电影
此示例使用 $setWindowFields 中的 $topN 来返回同一年上映的三部评分最高的每部电影的每部电影。
db.movies.aggregate( [ { $match: { year: { $in: [ 1999, 2001 ] }, "imdb.rating": { $gte: 8.5 } } }, { $setWindowFields: { partitionBy: "$year", output: { topThreeRatedInYear: { $topN: { sortBy: { "imdb.rating": -1, title: 1 }, output: { rating: "$imdb.rating", title: "$title" }, n: 3 }, window: { documents: [ "unbounded", "unbounded" ] } } } } }, { $project: { _id: 0, title: 1, year: 1, "imdb.rating": 1, topThreeRatedInYear: 1 } }, { $sort: { year: 1, "imdb.rating": -1 } } ] )
在前面的示例中:
$match筛选器查找在1999或2001上映且 IMDb 评级至少为8.5的电影。$setWindowFields按year对文档进行分区。window: { documents: [ "unbounded", "unbounded" ] }跨越整个年份分区,因此$topN在确定收视率最高的三部电影时会考虑当年的所有文档。$topN使用sortBy: { "imdb.rating": -1, title: 1 }按 IMDb 分数对电影进行排名,并使用title作为决胜局。同一年的每个文档都具有相同的topThreeRatedInYear值。$project删除不需要的字段以突出显示窗口函数结果。$sort按年份升序和评分降序对输出进行排序。