定义
$percentile7.0版本新增。
返回与指定的各百分位数一一对应的标量值数组。
可在以下阶段使用:
注意
消歧
本页描述了用作累加器时的
$percentile。累加器返回一群组输入文档的聚合值。您还可以在其他上下文中使用
$percentile:$percentile (expression),计算输入值大量的百分位数位数。$percentile (window function),在$setWindowFields阶段用于返回特定窗口中文档的百分位数值大量。
语法
{ $percentile: { input: <expression>, p: [ <expression1>, <expression2>, ... ], method: <string> } }
选项
$percentile 采用以下字段:
字段 | 类型 | 必要性 | 说明 |
|---|---|---|---|
| 表达式(expression) | 必需 |
|
| 表达式(expression) | 必需 |
|
| 字符串 | 必需 | MongoDB用于计算百分位数位数的方法。该方法必须是 |
行为
用作累加器时,$percentile:
为每个群组计算一设立百分位数,并对该群组中的所有文档进行聚合。
计算注意事项
用作累加器时,$percentile 始终使用近似算法。由于 t-digest 近似算法中的伪随机性,每次运行时,针对同一数据集计算出的百分位数位数可能不同。此外,$percentile 返回的值可能与真实的统计百分位数略有不同。
例子
本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
按类型计算评分百分位数
以下示例使用 $percentile累加器计算 Action 和 Drama 类型电影的第 50 和 90百分位数IMDB 评分:
db.movies.aggregate( [ { $unwind: "$genres" }, { $match: { genres: { $in: [ "Action", "Drama" ] }, "imdb.rating": { $exists: true } } }, { $group: { _id: "$genres", ratingPercentiles: { $percentile: { input: "$imdb.rating", p: [ 0.5, 0.9 ], method: "approximate" } } } }, { $sort: { _id: 1 } } ] )
上述管道:
使用
$unwind为genres大量中的每个类型创建单独的文档。使用
$match过滤分类为Action或Drama且具有 IMDB 评级字段的电影。按类型对电影进行分组。
使用
$percentile计算每个具有p: [0.5, 0.9]的类型的 IMDB 评分的第 50 和 90百分位数。使用
$sort按类型名称对输出进行排序。
输出 ratingPercentiles大量包含两个值:每种类型的第 50 个百分位数和第 90 个百分位数位数。