MongoDB聚合运算符:$stdDevPop

devtools/2024/10/22 14:27:25/

MongoDB聚合运算符:$stdDevPop

文章目录

  • MongoDB聚合运算符:$stdDevPop
    • 语法
    • 使用
      • 非数值类型的值
      • 单个值
      • 数组操作数
      • 窗口值
    • 举例
      • 应用于`$group`阶段
      • 在`$project`阶段使用
      • 在`$setWindowFields`阶段使用

$stdDevPop聚合运算符用来计算输入值的总体标准差。如果确认数据代表了整个数据集,且不希望对更大的群体进行归纳,可以使用 $stdDevPop来计算总体标准差。如果数据仅代表了总体的一部分样本,但又想把结论推广到整个数据集,则应该使用 $stdDevSamp

$stdDevPop可以应用于下面的阶段:

  • $addFields,从MongoDB3.4开始支持
  • $group
  • $match阶段的$expr表达式
  • $project
  • $replaceRoot,从MongoDB 3.4开始支持
  • $replaceWith,从MongoDB 4.2开始支持
  • $set,从MongoDB 4.2开始支持
  • $setWindowFields,从MongoDB 5.0开始支持

语法

当用于$bucket$bucketAuto$group$setWindowFields阶段时的语法为:

{ $stdDevPop: <expression> }

当用于其它阶段时,$stdDevPop的语法有两种形式:

  • 操作数为一个表达式:

    { $stdDevPop: <expression> }
    
  • 操作数为一个表达式列表:

     { $stdDevPop: [ <expression1>, <expression2> ... ]  }
    

<expression>为可解析为数组的表达式。

参数可以是任何能够解析为数组的表达式。

使用

非数值类型的值

$stdDevPop忽略所有非数值的值,如果所有的操作数都是非数值的值,$stdDevPop返回null。

单个值

如果样本只有一个数值类型的值,$stdDevPop返回0。

数组操作数

$group$setWindowFields阶段,如果表达式解析为数组,$stdDevPop会将操作数视为非数字值,对计算没有影响。

针对其它阶段:

  • 当使用单个表达式作为操作数时,如果表达式解析为数组,$stdDevPop会遍历数组元素,并对数字元素进行操作返回单个值。
  • 当使用表达式列表作为操作数,如果表达式解析为数组,$stdDevPop不会遍历该数组,而是将数组视为非数字值。

窗口值

对于$setWindowFields阶段窗口的值:

  • 忽略窗口中的非数值、空值和缺失字段。
  • 如果窗口为空,则返回 null。
  • 如果窗口中包含 NaN 值,则返回空值。
  • 如果窗口包含 Infinity 值,则返回空值。
  • 如果前面几点都不适用,则返回一个 double 值。

举例

应用于$group阶段

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

db.users.insertMany( [{ _id : 1, name : "dave123", quiz : 1, score : 85 },{ _id : 2, name : "dave2", quiz : 1, score : 90 },{ _id : 3, name : "ahn", quiz : 1, score : 71 },{ _id : 4, name : "li", quiz : 2, score : 96 },{ _id : 5, name : "annT", quiz : 2, score : 77 },{ _id : 6, name : "ty", quiz : 2, score : 82 }
] )

下面的例子计算测验的标准差:

db.users.aggregate( [{ $group: { _id: "$quiz", stdDev: { $stdDevPop: "$score" } } }
] )

操作结果如下:

{ "_id" : 2, "stdDev" : 8.04155872120988 }
{ "_id" : 1, "stdDev" : 8.04155872120988 }

$project阶段使用

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

db.quizzes.insertMany( [{_id : 1,scores : [{ name : "dave123", score : 85 },{ name : "dave2", score : 90 },{ name : "ahn", score : 71 }]},{_id : 2,scores : [{ name : "li", quiz : 2, score : 96 },{ name : "annT", score : 77 },{ name : "ty", score : 82 }]}
] )

下面的示例计算了每次测验的标准差:

db.quizzes.aggregate( [{ $project: { stdDev: { $stdDevPop: "$scores.score" } } }
] )

操作结果如下:

{ "_id" : 2, "stdDev" : 8.04155872120988 }
{ "_id" : 1, "stdDev" : 8.04155872120988 }

$setWindowFields阶段使用

使用下面的脚本创建cakeSales集合,包含了在加利福尼亚州(CA)和华盛顿州(WA)的蛋糕销售记录:

db.cakeSales.insertMany( [{ _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"),state: "CA", price: 13, quantity: 120 },{ _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"),state: "WA", price: 14, quantity: 140 },{ _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"),state: "CA", price: 12, quantity: 145 },{ _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"),state: "WA", price: 13, quantity: 104 },{ _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"),state: "CA", price: 41, quantity: 162 },{ _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"),state: "WA", price: 43, quantity: 134 }
] )

下面的示例在 $setWindowFields 阶段使用 $stdDevPop 输出每个州蛋糕销售数量的人口标准差:

db.cakeSales.aggregate( [{$setWindowFields: {partitionBy: "$state",sortBy: { orderDate: 1 },output: {stdDevPopQuantityForState: {$stdDevPop: "$quantity",window: {documents: [ "unbounded", "current" ]}}}}}
] )

在本例中:

  • partitionBy: "$state"按照州state对集合的文档进行分区,有CAWA两个区。
  • sortBy: { orderDate: 1 }根据orderDate对分区内文档进行由小到大的排序,orderDate最早的排在第一个。
  • output使用$stdDevPop将窗口内文档的quantity标准差赋予stdDevPopQuantityForState字段。窗口包含无界下限和输出中的当前文档之间的文档,这意味着$stdDevPop返回分区开头和当前文档之间文档的数量总体标准差。

在此示例输出中,CAWAquantity总体标准差放在stdDevPopQuantityForState字段:

操作结果如下:

{ _id : 4, type : "strawberry", orderDate : ISODate("2019-05-18T16:09:01Z"),state : "CA", price : 41, quantity : 162, stdDevPopQuantityForState : 0 }
{ _id : 0, type : "chocolate", orderDate : ISODate("2020-05-18T14:10:30Z"),state : "CA", price : 13, quantity : 120, stdDevPopQuantityForState : 21 }
{ _id : 2, type : "vanilla", orderDate : ISODate("2021-01-11T06:31:15Z"),state : "CA", price : 12, quantity : 145, stdDevPopQuantityForState : 17.249798710580816 }
{ _id : 5, type : "strawberry", orderDate : ISODate("2019-01-08T06:12:03Z"),state : "WA", price : 43, quantity : 134, stdDevPopQuantityForState : 0 }
{ _id : 3, type : "vanilla", orderDate : ISODate("2020-02-08T13:13:23Z"),state : "WA", price : 13, quantity : 104, stdDevPopQuantityForState : 15 }
{ _id : 1, type : "chocolate", orderDate : ISODate("2021-03-20T11:30:05Z"),state : "WA", price : 14, quantity : 140, stdDevPopQuantityForState : 15.748015748023622 }

http://www.ppmy.cn/devtools/31648.html

相关文章

python学习笔记----面向对象(十)

一、什么是类 类是一个抽象的模板&#xff0c;用于创建具体的实例。可以将类理解为一个蓝图&#xff0c;它定义了一系列对象共有的属性&#xff08;数据&#xff09;和方法&#xff08;函数&#xff09;。类是对一组具有相同属性和功能的对象的抽象。例如&#xff0c;你可以定…

本地基于知识库的大模型的使用教程

本地基于知识库的大模型的使用教程 启动 双击 大模型启动.bat文件&#xff0c;内容如下&#xff1a; cmd /k "cd /d G:\Anaconda3\Scripts && activate.bat && cd /d D:\docdb_llm && conda activate python3.11 && python startup.py…

第76天:WAF攻防-信息收集识别被动探针代理池仿指纹白名单

目录 基础知识 案例一: 信息收集-被动扫描-黑暗引擎&三方接口 案例二: 信息收集-目录扫描-Python 代理加载脚本 案例三: 信息收集-爬虫扫描-Awvs&Xray&Goby内置 基础知识 什么是 WAF &#xff1f; Web Application Firewall &#xff08; web 应用防火墙&am…

ue引擎游戏开发笔记(25)——增添特效

1需求分析 为了让游戏更真实&#xff0c;需要给游戏增添一些特效&#xff0c;例如敌人被摧毁时出现一个爆炸特效&#xff0c;子弹发射时有尾烟等等。 2.操作实现 1.与声音类似&#xff0c;首先也需要在需要的地方先建立声明&#xff0c;以便能在引擎中进行设置&#xff0c; 2.…

PPT基础

5种ppt仅可读形式 Ⅰ 开始选项卡 1.【幻灯片】组中&#xff1a;新建幻灯片&#xff0c;从大纲中导入幻灯片&#xff1b;修改幻灯片的版式&#xff1b;节&#xff08;新增节&#xff0c;重命名节&#xff09;。 2.【字体】组中&#xff1a;设置字体&#xff0c;字体大小&…

kaggle无法注册怎么办

在浏览kaggle网站&#xff0c;或者是参加kaggle竞赛时&#xff0c;常常会遇到需要登陆kaggle账号的情况。而在注册时&#xff0c;却发现无论如何也无法弹出人机识别的验证码&#xff0c;导致无法注册成功。本文会手把手的讲解一种注册kaggle的方法&#xff08;edge浏览器&#…

使用RTSP将笔记本摄像头的视频流推到开发板

一、在Windows端安装ffmpeg 1. 下载ffmpeg:下载ffmpeg 解压ffmpeg-master-latest-win64-gpl.zip bin 目录下是 dll 动态库 , 以及 可执行文件 ;将 3 33 个可执行文件拷贝到 " C:\Windows " 目录下 ,将所有的 " .dll " 动态库拷贝到 " C:\Windows\Sy…

Django整合多种认证方式

承接上一篇&#xff1a;Django知识点总结-CSDN博客 目录 25.使用 Django REST framework实现用户认证和授权 26.通过djangorestframework-simplejwt使用JWT(JSON Web Token) 27.使用django-auth-ldap进行用户认证 28. 使用django-cas-ng实现集中认证及实现单点登录 29. …