MongoDB聚合运算符:$percentile

MongoDB中的$percentile聚合运算符:窗口函数、计算方法与应用实例


$percentile聚合运算符返回与指定百分位值相对应的标量值数组。 $percentile可以用作 $group阶段的累加器或聚合表达式。

语法

{
   
   
   $percentile: {
   
   
      input: <expression>,
      p: [ <expression1>, <expression2>, ... ],
      method: <string>
   }
}

参数字段说明

字段 类型 是否必须 说明
input 表达式 $percentile计算input数据的百分位值。input必须是字段或数值表达式,如果表达式无法转换为数值类型将被忽略
p 表达式 $percentile计算p中每个元素的百分位值,这些元素表示百分比,并且计算结果必须为0.01.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%的百分位数值实际上代表0100%的样本。
  • 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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值