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 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/795047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的常见免费开源绘图工具对比 draw.io/Excalidraw/Lucidchart/yEd Graph Editor/Dia/

拓展阅读 常见免费开源绘图工具 OmniGraffle 创建精确、美观图形的工具 UML-架构图入门介绍 starUML UML 绘制工具 starUML 入门介绍 PlantUML 是绘制 uml 的一个开源项目 UML 等常见图绘制工具 绘图工具 draw.io / diagrams.net 免费在线图表编辑器 绘图工具 excalidr…

spa、vue、elementUi

spa (single page application). 动态重写当前页面而非从服务器重新加载整个新页面。使应用程序更像一个桌面应用程序。所有的html、javascript、css通过单个页面检索加载资源。前端页面使用ajax与后端通信。一个项目只有一个html页面。所有的页面跳转都通过路由导航。 vue可用…

【OpenCV进阶】图像中添加中文字幕

OpenCV中的putText函数可以在图像上添加一些你想要的信息&#xff0c;但是该函数只能添加英文字母或数字&#xff0c;无法添加中文字幕。函数原型如下&#xff1a; CV_EXPORTS_W void putText( InputOutputArray img, const String& text, Point org,int fontFace, double…

XSS分类

简介 XSS全称为Cross Site Scripting&#xff0c;为了和CSS分开简写为XSS&#xff0c;中文名为跨站脚本。该漏洞发生在用户端&#xff0c;是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的身份进行操作等行为。 反射型XSS …

云数据库AWS Aurora(一)

背景 Amazon Aurora 是Amazon Web Services (AWS) 提供的一种关系数据库服务&#xff0c;它兼容并提供与MySQL和PostgreSQL相同的API。Aurora设计为云环境中的商业数据库&#xff0c;具备高性能、高可用性、低成本等特性。 AWS一些组件定义 首先介绍下AWS一些组件。 EC2&am…

Swift:在 Win10 上编程入门

访问 https://swift.org/download/ 找到 Windows 10&#xff1a;x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ &#xff0c;安装后大约占2.56GB 官网文档&#xff1a;https://www.swift.org/documentation/ 中文教程&#xff1a;The swift…

C++之双向链表与哈希链表用法区别实例(二百六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Unity常用性能优化

DrawCall&#xff1a;CPU向GPU发送渲染命令的过程。 批次&#xff1a;批次是指在一次渲染帧中提交的DrawCall数量。 合批&#xff1a;即批量渲染&#xff0c;合批是一种优化技术&#xff0c;通过将多个需要渲染的物体合并为一个或少数几个DrawCall。 静态合批&#xff1a;对…

Streamlit 构建大语言模型 (LLM) web 界面

文章目录 Streamlit 构建大语言模型 (LLM) web 界面选择Streamlit的原因原理流程streamlit布局示例代码聊天机器人示例代码&#xff08;简化版&#xff09; Streamlit在ChatGLM3-6B中的应用 Streamlit 构建大语言模型 (LLM) web 界面 选择Streamlit的原因 易用性&#xff1a;S…

Cisco Unified Communications Manager (CallManager) 15.0 SU1 - 统一通信与协作

Cisco Unified Communications Manager (CallManager) 15.0 SU1 - 统一通信与协作 思科统一通信管理器 (CallManager) 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-ucm-15/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;…

基于开源软件构建存储解决方案的思考

近来看了一些IBM的存储产品的资料&#xff0c;有一些收获。 依据存储软件和搭配硬件&#xff0c;IBM存储产品的组合&#xff0c;大致分类如下&#xff1a; 自研存储软件&#xff0c;搭配自研专有硬件自研存储软件&#xff0c;搭配通用服务器硬件&#xff0c;比如IBM Storage S…

需求分析及设计定义

背景 经过不断的折腾&#xff0c;一切过程都是为了呈现输出&#xff0c;这个阶段就是要交付需求和方案的环节了&#xff0c;很多失败的项目就是上来就到这个环节&#xff0c;倒着捣鼓&#xff0c;先写个文档&#xff0c;做个原型&#xff0c;甚至提出方案&#xff0c;然后再和…

Redis 未授权访问漏洞

出现以下函数 eval函数&#xff1a;因为脚本内容必须通过eval来执行 2.luaopen_io函数&#xff1a;因为此攻击必须通过执行luaopen_io函数来获取 io库 3、.popen函数&#xff1a;恶意命令必须通过io库中的popen函数来执行&#xff0c;为什么拦截规则不是io.popen&#xff0…

状态优先级

文章目录 状态优先级1. 进程状态1.1 进程状态查看1.2 僵尸进程1.3 孤儿进程 2.进程优先级2.1 基本概念2.2 查看系统进程2.3 PRI and NI2.4 PRI vs NI 3. 查看进程优先级的命令3.1 top命令更改nice3.2 其他概念 状态优先级 1. 进程状态 看看Linux内核源代码怎么说 为了弄明白…

深入浅出 -- 系统架构之分布式系统底层的一致性

在分布式领域里&#xff0c;一致性成为了炙手可热的名词&#xff0c;缓存、数据库、消息中间件、文件系统、业务系统……&#xff0c;各类分布式场景中都有它的身影&#xff0c;因此&#xff0c;想要更好的理解分布式系统&#xff0c;必须要理解“一致性”这个概念。 其实关于…

Java NIO Selector选择器简介

文章目录 前言一、IO多路复用二、Selector如何确保多个通道的操作协调一致三、NIO中怎样实现通道的非阻塞IO操作四、网络服务器和客户端简单代码示例服务器端代码客户端端代码 前言 Selector是Java NIO&#xff08;New I/O&#xff09;中的核心组件之一&#xff0c;用于检查一…

云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)

前言 读完本文&#xff0c;你将对云原生下的核心概念微服务、容器云、DevOps、Immutable Infrastructure、Declarative-API、Serverless、Service Mesh 等有一个相对详细的了解&#xff0c;帮助你快速掌握云原生的核心和要点。 因题主资源有限, 这里会选用部分云服务商的组件进…

LeetCode:1026. 节点与其祖先之间的最大差值(DFS Java)

目录 1026. 节点与其祖先之间的最大差值 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 1026. 节点与其祖先之间的最大差值 题目描述&#xff1a; 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff…

【面经】3月29日 美团/美团平台/后端/一面/1h

面试官先介绍自己部门的业务&#xff1a;存储中心&#xff0c;涉及到大量数据的离线处理&#xff08;亿级别&#xff09;。 手撕&#xff08;删除链表倒数第k个节点&#xff09; 自我介绍 项目介绍&#xff08;还没说完被打断了&#xff0c;面试官说你这个感觉就是把功能说了一…

11-1(2)-CSS 背景+CSS 精灵图

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 一、CSS 背景1 背景颜色2 背景色半透明3 背景图片4 背景平铺5 背景图片位置6 …