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

$中位数(窗口函数)

$median

7.0版本新增。

返回指定窗口中文档的中位数位数(第 50 个百分位数)。您可以在基于文档和基于范围的窗口中使用 $median。

注意

消歧

本页介绍了用作窗口函数的 $median。

您还可以在其他上下文中使用 $median:

{
$setWindowFields: {
...
output: {
<field>: {
$median: {
input: <expression>,
method: <string>
}
}
}
}
}
字段
类型
必要性
说明

input

表达式(expression)

必需

返回用于计算中位数的值。 input 必须是计算结果为数字的表达式。如果表达式的计算结果不是数字,$median 计算将忽略该值。

method

字符串

必需

mongod 用于计算中位数值的方法。该方法必须是 'approximate'。

当 $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 结果以提高可读性。

给本页内容打分