文章目录
$percentile聚合运算符返回与指定百分位值相对应的标量值数组。
$percentile可以用作
$group阶段的累加器或聚合表达式。
语法
{
$percentile: {
input: <expression>,
p: [ <expression1>, <expression2>, ... ],
method: <string>
}
}
参数字段说明
| 字段 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
input |
表达式 | 是 | $percentile计算input数据的百分位值。input必须是字段或数值表达式,如果表达式无法转换为数值类型将被忽略 |
p |
表达式 | 是 | $percentile计算p中每个元素的百分位值,这些元素表示百分比,并且计算结果必须为0.0到1.0(含)范围内的数值。$percentile返回结果的顺序与p中元素的顺序相同 |
method |
字符串 | 是 | mongod用于计算百分位值的方法,值必须是"approximate" |
使用
$percentile可以在$group和$setWindowFields作为累加器使用,在$project阶段可以作为聚合表达式使用。$percentile做为累加器使用时,具有下面的特性:- 在结算阶段,所有的文档只有一个结果。
- 使用 t-digest 算法计算基于百分位数的近似指标。
- 使用近似方法来扩展大量数据。
$percentile做为表达式使用时,具有下面的特性:- 接受数组作为输入
- 为每个输入文档计算单独的结果
操作类型
- 在
$group阶段,$percentile是一个累加器,用于计算窗口中所有文档的值。 - 在
$project阶段,$percentile是一个聚合表达式,用于计算每个文档的值。 - 在
$setWindowFields阶段,$percentile会像聚合表达式一样返回每个文档的结果,但其结果会像累加器一样在文档组中计算。
计算时的注意事项
- 在
$group阶段,$percentile总是使用近似计算方法。 - 在
$project阶段,即使指定了近似计算方法,$percentile也可能使用离散计算方法。 - 在
$setWindowFields阶段,计算量决定了$percentile使用的计算方法。 - 因为算法计算的是近似值,所以即使在相同的数据集上,
$percentile返回的计算百分位数也可能不同。 - 重复样本会导致模糊性。如果存在大量重复样本,百分位数值可能无法代表实际的样本分布,如果一个所有样本都相同的数据集,数据集中的所有值都位于或低于任何一个百分位数,50%的百分位数值实际上代表
0或100%的样本。 - 当
p = 0.0时,$percentile返回最小值。 - 当
p = 1.0时,$percentile返回最大值。*
input为数组
如果在$project阶段使用$percentile作为聚合表达式,则可以使用数组作为输入。语法是:
{
$percentile: {
input: [ <expression1, <expression2>, .., <expressionN> ],
p: [ <expression1>, <expression2>, ... ],
method: <string>
}
}
窗口功能
通过窗口函数可以计算出相邻文档移动 "窗口 "的结果。。当每个文档通过管道时,当每个文件通过管道时,$setWindowFields 阶段就会:
- 重新计算当前窗口中的文档集合
- 计算集合中所有文档的值
- 返回该文档的单个值
可以在$setWindowFields阶段使用$percentile来计算时间序列或其他相关数据的滚动统计信息。
在$setWindowField阶段使用$percentile时,输入值必须是字段名称,否则操作将失败。
举例
使用下面的脚本创建testScores集合:
db.testScores.insertMany( [
{
studentId: "2345", test01: 62, test02: 81, test03: 80 },
{
studentId
MongoDB中的$percentile聚合运算符:窗口函数、计算方法与应用实例

最低0.47元/天 解锁文章
6021

被折叠的 条评论
为什么被折叠?



