MongoDB聚合运算符:$median

2024-04-06 08:28

本文主要是介绍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, test02: 83, test03: 79 },{ studentId: "2358", test01: 67, test02: 82, test03: 78 },{ studentId: "2367", test01: 64, test02: 72, test03: 77 },{ studentId: "2369", test01: 60, test02: 53, test03: 72 }
] )

$median作为累加器

下面的聚合,创建一个累加器用来中位数:

db.testScores.aggregate( [{$group: {_id: null,test01_median: {$median: {input: "$test01",method: 'approximate'}}}}
] )

结果:

{ _id: null, test01_median: 62 }

_id字段的值为空,所以$group选择了集合中的所有文档。

$median累加器用test01字段作为输入字段,计算出字段的中位数为62

p r o j e c t 阶段使用 project阶段使用 project阶段使用median

$group阶段,$median是一个累加器,从所有文档中计算单个值。在$project阶段,$median是一个聚合表达式,计算所有文档的值。

$project阶段,可以使用字段名或数组作为输入。

db.testScores.aggregate( [{$project: {_id: 0,studentId: 1,testMedians: {$median: {input: [ "$test01", "$test02", "$test03" ],method: 'approximate'}}}}
] )

结果输出:

{ studentId: '2345', testMedians: 80 },
{ studentId: '2356', testMedians: 79 },
{ studentId: '2358', testMedians: 78 },
{ studentId: '2367', testMedians: 72 },
{ studentId: '2369', testMedians: 60 }

$median是一个聚合表达式时,每个studentId都有一个结果。

$setWindowField阶段使用$median

根据本地数据趋势确定百分位值,需要在$setWindowField聚合管道阶段使用$median。下面的例子创建一个窗口来过滤分数:

db.testScores.aggregate( [{$setWindowFields: {sortBy: { test01: 1 },output: {test01_median: {$median: {input: "$test01",method: 'approximate'},window: {range: [ -3, 3 ]}}}}},{$project: {_id: 0,studentId: 1,test01_median: 1}}
] )

执行的结果:

{ studentId: '2356', test01_median: 60 },
{ studentId: '2369', test01_median: 60 },
{ studentId: '2345', test01_median: 60 },
{ studentId: '2367', test01_median: 64 },
{ studentId: '2358', test01_median: 64 }

下面的聚合操作使用$median运算符来判断qty是否小于250

db.inventory.aggregate([{$project:{item: 1,qty: 1,qtyLt250: { $median: [ "$qty", 250 ] },_id: 0}}]
)

操作返回下面的结果:

{ "item" : "abc1", "qty" : 300, "qtyLt250" : false }
{ "item" : "abc2", "qty" : 200, "qtyLt250" : true }
{ "item" : "xyz1", "qty" : 250, "qtyLt250" : false }
{ "item" : "VWZ1", "qty" : 300, "qtyLt250" : false }
{ "item" : "VWZ2", "qty" : 180, "qtyLt250" : true }

这篇关于MongoDB聚合运算符:$median的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/879460

相关文章

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

【重学 MySQL】十九、位运算符的使用

【重学 MySQL】十九、位运算符的使用 示例检查权限添加权限移除权限 在 MySQL 中,位运算符允许你直接在整数类型的列或表达式上进行位级操作。这些操作对于处理那些需要在二进制表示上进行直接修改或比较的场景特别有用,比如权限管理、状态标记等。 &(位与) 对两个数的二进制表示进行位与操作。只有两个相应的二进制位都为 1 时,结果的该位才为 1,否则为 0。 |(位

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

生产mongodb 分片与集群 方案

链接:http://my.oschina.net/pwd/blog/411439#navbar-header 注:主要是有一键安装的脚本可以借鉴

mongodb基本命令和Java操作API示例

1.Mongo3.2 java API示例:http://www.cnblogs.com/zhangchaoyang/articles/5146508.html 2.MongoDB基本命:http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html 3.java MongoDB查询(一)简单查询: http://www.cnblogs

使用jetty和mongodb做个简易文件系统

使用jetty和mongodb做个简易文件系统 - ciaos 时间 2014-03-09 21:21:00   博客园-所有随笔区 原文   http://www.cnblogs.com/ciaos/p/3590662.html 主题  MongoDB  Jetty  文件系统 依赖库: 1,jetty(提供http方式接口) 2,mongodb的java驱动(访问mo