定义
返回指定窗口中文档的中位数位数(第 50 个百分位数)。您可以在基于文档和基于范围的窗口中使用 $median。
注意
消歧
本页介绍了用作窗口函数的 $median。
您还可以在其他上下文中使用 $median:
$median (accumulator),用于分组以返回一群组输入文档的中位数值。$median (expression),返回值大量的中位数。
语法
{ $setWindowFields: { ... output: { <field>: { $median: { input: <expression>, method: <string> } } } } }
命令字段
字段 | 类型 | 必要性 | 说明 |
|---|---|---|---|
| 表达式(expression) | 必需 | 返回用于计算中位数的值。 |
| 字符串 | 必需 |
|
行为
计算注意事项
当 $median 用作窗口函数时,即使指定了 method: "approximate",它也始终使用精确的百分位数计算算法,而不是近似算法。
例子
本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
此示例使用 $setWindowFields 计算属于冒险、喜剧和剧情片这三种类型的每部电影的 IMDb 评分中位数。该窗口跨越上一年、同年和次年(范围[ -1, 1 ]):
db.movies.aggregate( [ { $match: { genres: { $all: ["Adventure", "Comedy", "Drama"] }, year: { $gte: 2000, $lte: 2005 } } }, { $setWindowFields: { sortBy: { year: 1 }, output: { medianRatingByYear: { $median: { input: "$imdb.rating", method: "approximate" }, window: { range: [ -1, 1 ] } } } } }, { $project: { _id: 0, title: 1, year: 1, genres: 1, "imdb.rating": 1, medianRatingByYear: 1 } }, { $sort: { year: 1, "imdb.rating": -1 } }, { $limit: 10 } ] )
在前面的管道中:
$match筛选器,用于筛选在 2000 和 2005 之间上映的属于冒险、喜剧和剧情片这三种类型的电影。$setWindowFields按year升序排序,并应用$median和基于范围的[ -1, 1 ]窗口。每部电影的medianRatingByYear是其一年内上映的所有三种类型电影的imdb.rating中中位数。$project仅包括title、year、genres、imdb.rating和medianRatingByYear字段。$sort按year升序对结果排序,然后按imdb.rating降序排序。$limit将输出限制为 10 结果以提高可读性。