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