MongoDB聚合运算符:$median

$median聚合运算符以标量值返回中位数的近似值,即第50百分位数。$median可以在$group阶段的累加器或聚合表达式使用。

语法

{
   
   
   $median: {
   
   
      input: <number>,
      method: <string>
   }
}

参数字段

  • input:必须的参数字段,数值类型的字段或表达式,指定要计算中位数的值,如果值不是字符类型,在计算式会被忽略。
  • method:字符串或字符串表达式,指定中位数的计算方法,其值必须为approximate

使用

  • $median可以在下面的阶段使用
    • 可以用于$group$setWindowFields阶段的累加器
    • 可以用于$project阶段的聚合表达式
  • $median作为累加器时有下面的特征:
    • 计算阶段中所有文档的单个结果
    • 使用t-digest算法计算基于百分位数的近似指标。
    • 使用近似方法来扩展大量数据。
  • $median作为聚合表达式具有以下特点:
    • 接受数组作为输入
    • 每个输入的文档计算一个结果

类型操作

  • $group 阶段,$median 是一个累加器,用于计算窗口中所有文档的值。
  • $project 阶段,$median 是一个聚合表达式,用于计算每个文档的值。
  • $setWindowFields 阶段,$median 像聚合表达式一样返回每个文档的结果,但结果是像累加器一样对文档组进行计算的。

计算注意事项

  • $group阶段,$median始终使用近似计算方法。
  • $project阶段,即使指定了近似方法,$median仍然使用离散计算方法。
  • $setWindowFields阶段,工作负载决定$median使用的计算方法。
  • 因为算法计算的是近似值,所以即使在相同的数据集上,计算出的百分位数$median返回也可能会有所不同。
  • 重复的样本可能会导致歧义。如果存在大量重复项,百分位数可能无法代表实际的样本分布。比如在一个所有样本都相同的数据集,数据集中的所有值都处于或低于任何百分位, “第 50 个百分位”值实际上代表 0% 或 100% 的样本。

数组处理

如果在$project阶段使用$median作为聚合表达式,则可以使用数组作为输入,$median忽略非数字数组值。

语法为:

{
   
   
   $median:
      {
   
   
         input: [ <expression1, <expression2>, ..., <expressionN> ],
         method: <string>
      }
}

窗口函数

通过窗口函数,可以计算出相邻文档移动 "窗口 "的结果。当文档通过管道时,$setWindowFields阶段:

  • 重新计算当前窗口中的文档集
  • 计算集合中所有文档的值
  • 返回该文档的单个值

可以在$setWindowFields阶段使用$median计算时间序列或其他相关数据的滚动统计数据。

$setWindowField阶段使用$median时,输入值必须是字段名,如果输入的是数组而不是字段名,操作将失败。

举例

使用下面的脚本创建testScores集合:

db.testScores.insertMany( [
   {
   
    studentId: "2345", test01: 62, test02: 81, test03: 80 },
   {
   
    studentId: "2356", test01: 60, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

原子星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值