Mongodb聚合操作$isNumber

又是mongodb集合的不强制文档具有相同一致的结构产生的问题。Mongodb这种特点,确实带来了灵活强大的优势,但Mongodb的一些操作符和特性看起来在为这种灵活的结构买单。

这次有两个问题。某一个气温监控系统,采用了不同的传感器厂家生产的系统,不同厂家返回的温度数据有不同的类型,有数字类型的,有字符类型的。还有的传感器损坏,返回来了空数据。

另外一个问题是学生在学校考试当中取得的成绩。不同课程成绩按照不同的录入方式进入到系统。有的按照分数评级,录入了ABCDF这五个等级。而有的课程录入了学生绩点。现在到了评奖学籍的时候,要计算学生成绩绩点的平均值。这个为难坏了工程师。

Mongodb聚合操作用,方法$isNumber来判断字段值或表达式的返回值是否为数字类型。

定义

$isNumber,判断指定表达式返回值的类型是否是数字类型。若返回数据类型是Integer, Decimal, Double, Long当中的一种,$isNumber返回true,其他的非数字类型,null或文档没有该字段,则返回false。

$isNumber使用下面的语法来判断表达式的值。其中expression是任何一个可用的表达式。

{$isNumber: <expression>}

应用

判断字段值是否为数字类型

有一个传感器表格,记录了下面的信息。其中reading字段中有各种数据类型。

db.sensors.insertMany([{"_id": 1, "reading": NumberDecimal("26.0") },{"_id": 2, "reading": NumberLong(25.0) },{"_id": 3, "reading": NumberInt(24) },{"_id": 4, "reading": 24.0 },{"_id": 5, "reading": "24" },{"_id": 6, "reading": [ NumberDecimal(26)] }
])

使用聚合查询,为查询结果添加新字段isNumber, 并返回reading字段的类型

db.sensors.aggregate([{$addFields: { //在聚合查询中添加新字段isNumber和typeisNumber: {$isNumber: "$reading"}, //判断reading字段是否为数字类型type: {$type: "$reading"}}
}])/* 1 */
{"_id" : 1,"reading" : Decimal128("26.0"),"isNumber" : true,"type" : "decimal"
},/* 2 */
{"_id" : 2,"reading" : Long("25"),"isNumber" : true,"type" : "long"
},/* 3 */
{"_id" : 3,"reading" : 24,"isNumber" : true,"type" : "int"
},/* 4 */
{"_id" : 4,"reading" : 24,"isNumber" : true,"type" : "int"
},/* 5 */
{"_id" : 5,"reading" : "24","isNumber" : false,"type" : "string"
},/* 6 */
{"_id" : 6,"reading" : [ Decimal128("26") ],"isNumber" : false,"type" : "array"
}

依据$isNumber的结果修改返回字段值

学生成绩表grade中包含了学生成绩信息。 其中grade字段保存了两种数据类型,一种是字符类型的ABCDF,另一种数字类型的绩点成绩。

db.grades.insertMany([{"student_id": 457864153,"class_id": "M044","class_desc": "Introduction to MongoDB 4.4","grade": "A"
},{"student_id": 457864153,"class_id": "M103","class_desc": "Basic Cluster Administration","grade": 3.0
},{"student_id": 978451637,"class_id": "M320","class_desc": "MongoDB data Modeling","grade": "C"
},{"student_id": 978451637,"class_id": "M001","class_desc": "MongoDB Basics","grade": 4.0
}])

现在需要计算两个学生的平均绩点。

  • 为查询结果添加新字段points表示学生的绩点
  • 使用$isNumber判断grade字段是否为数字类型,当为数字类型是,直接返回给points字段,如果不是数字类型, 按照等级对应关系返回给points字段。 A-4.0,B-3.0,C-2.0,D-1.0,F-0.0.
db.grades.aggregate([{$addFields: {"points": {$cond: { if: {$isNumber: "$grade" }, then: "$grade", else:  {$switch: {branches: [{ case: {$eq: ["$grade","A"]}, then: 4.0 },{ case: {$eq: ["$grade","B"]}, then: 3.0 },{ case: {$eq: ["$grade","C"]}, then: 2.0 },{ case: {$eq: ["$grade","D"]}, then: 1.0 },{ case: {$eq: ["$grade","F"]}, then: 0.0 },]}   }}}}
},{$group: { _id: "$student_id",GPA: {$avg: "$points"}}
}])

运行聚合查询,返回结果

/* 1 */
{"_id" : 978451637,"GPA" : Double("3")
},/* 2 */
{"_id" : 457864153,"GPA" : 3.5
}

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

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

相关文章

8868体育助力意甲罗马俱乐部 迪巴拉有望付出

8868体育助力意甲罗马俱乐部 迪巴拉有望付出 意甲罗马俱乐部是8868体育合作球队之一&#xff0c;本赛季&#xff0c;在意甲第14轮的比赛中&#xff0c;罗马客场2-1战胜萨索洛&#xff0c;积分上升到意甲第4位。 有报道称&#xff0c;迪巴拉在对阵佛罗伦萨的比赛中受伤&#xff…

sql中date查询优化

SQL日期查询的优化通常涉及到使用适当的日期函数、避免不必要的日期格式转换以及确保查询条件的合理化。以下是一些针对日期查询的常见优化策略&#xff1a; 1. 使用合适的日期函数 使用数据库提供的日期函数&#xff0c;如 DATE(), NOW(), CURDATE(), DAY(), MONTH(), YEAR(…

网络Ping不通故障定位思路

故障分析 Ping不通是指Ping报文在网络中传输&#xff0c;由于各种原因&#xff08;如链路故障、ARP学习失败等&#xff09;而接收不到所有Ping应答报文的现象。 如图1-1所示&#xff0c;以一个Ping不通的尝试示例&#xff0c;介绍Ping不通故障的定位思路。 图1-1 Ping不通故…

在机器学习训练测试集中,如何切分出一份验证集

文章目录 1.读取数据&#xff1a;2.绘图查看target数量情况&#xff1a;3.特征拓展&#xff1a;4.构建X&#xff0c;y&#xff1a;5.拆分训练集和测试集&#xff0c;特征做缩放处理&#xff1a;6.从训练集里再切一次出验证集&#xff0c;特征做缩放处理&#xff1a;7.测试集训练…

Shell基本命令 Mkdir创建 cp 复制 ls-R递归打印 文件权限

mkdir 是在命令行界面下创建目录&#xff08;文件夹&#xff09;的命令。它是 “make directory” 的缩写。 以下是 mkdir 命令的基本语法&#xff1a; mkdir 目录路径其中&#xff0c;目录路径 是要创建的目录的路径和名称。 例如&#xff0c;要在当前目录下创建一个名为 m…

Java介绍

Java 是一门纯粹的面向对象编程语言&#xff0c;它吸收了C的各种优点&#xff0c;还努力摒弃了C里难以理解的多继承、指针等概念&#xff0c;真正地实现了面向对象理论&#xff0c;因而具有功能强大和简单易用两个特征。 除了基础语法之外&#xff0c;Java还有许多必须弄懂的特…

OpenCV-Python(22):直方图的计算绘制与分析

目标 了解直方图的原理及应用使用OpenCV 或Numpy 函数计算直方图使用Opencv 或者Matplotlib 函数绘制直方图学习函数cv2.calcHist()、np.histogram()等 原理及应用 直方图是一种统计图形&#xff0c;是对图像的另一种解释&#xff0c;用于表示图像中各个像素值的频次分布。直…

Linux驱动开发之杂项设备注册和Linux2.6设备注册

目录 一、杂项设备注册 杂项设备注册简介 杂项设备注册特点: 杂项设备注册相关API misc_register() misc_deregister() 杂项设备注册相关例程 例程简介 源码分享 二、Linux 2.6设备注册 Linux2.6设备注册简介 Linux 2.6设备注册特点 Linux2.6设备注册流程 ​Linu…

sklearn 中matplotlib编制图表

代码 # 导入pandas库&#xff0c;并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件&#xff0c;将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

人机交互中信息数量与质量

在人机交互中&#xff0c;信息的数量和质量都是非常重要的因素。 信息的数量指的是交互过程中传递的信息的多少。信息的数量直接影响到交互的效率和效果&#xff0c;如果交互中传递的信息量太少&#xff0c;可能导致交互过程中的信息不足&#xff0c;用户无法得到想要的结果或者…

三菱人机交互GT Designer的使用(二,开关,指示灯,数值显示,数值输入)

今天也开始每日一学&#xff0c;内容为开关&#xff0c;指示灯&#xff0c;数值显示&#xff0c;数值输入&#xff0c;以为这篇文章比较长&#xff0c;所有小编决分为3篇内容写完&#xff0c;谢谢大家阅读&#xff0c;不足之处&#xff0c;欢迎指正。 目录 开关 位&#xff0c…

【UE5蓝图】读取本地json文件修改窗口大小

效果 插件 蓝图 1.判断文件存在 2.1文件不存在&#xff0c;生成文件 {"ResolutionX":540, "ResolutionY":960} 2.2文件存在&#xff0c;直接读取 3.设置窗口大小 遇到的坑 1.分辨率太大&#xff0c;导致效果不理想&#xff0c;建议先往小填写。 2.选对…

JSON 详解

文章目录 JSON 的由来JSON 的基本语法JSON 的序列化简单使用stringify 方法之 replacerstringify 方法之 replacer 参数传入回调函数stringify 方法之 spacestringify 方法之 toJSONparse 方法之 reviver 利用 stringify 和 parse 实现深拷贝 json 相信大家一定耳熟能详&#x…

React Hooks 面试题 | 08.精选React Hooks面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时&#xff0c;获取当前主题色 2、把主题色定义成全局变量&#xff08;即在app.js中设置&#xff09; 3、tabBar也需要定义全局变量&#xff0c;在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…

MySQL数据库导入100万数据不同方式的性能差异

本文将介绍MySQL数据库导入100万数据的三种方式性能比较。 三种方式分别为&#xff1a; &#xff08;1&#xff09;逐条INSERT &#xff08;2&#xff09;批量INSERT提交 &#xff08;3&#xff09;通过mysql自带的load data命令 应用场景&#xff1a;假设需要向100万个号码…

neo4j运维管理

管理数据库 概念 Neo4j 5(从v4.0)&#xff0c;可以同时创建和使用多个活动数据库。 DBMS Neo4j是一个数据库管理系统(DBMS)&#xff0c;能够管理多个数据库。DBMS可以管理一个独立的服务器&#xff0c;也可以管理集群中的一组服务器。 实例 Neo4j实例是运行Neo4j服务器代…

gitLab页面打tag操作步骤

作者&#xff1a;moical 链接&#xff1a;gitLab页面打tag简单使用 - 掘金 (juejin.cn) 来源&#xff1a;稀土掘金 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 ---------------------------------------------------------------------…

Linux lpr命令教程:如何使用lpr命令打印文件(附案例详解和注意事项)

Linux lpr命令介绍 lpr命令在Unix-like操作系统中用于提交打印任务。如果在命令行中指定了文件名&#xff0c;那么这些文件将被发送到指定的打印机&#xff08;如果没有指定目的地&#xff0c;则发送到默认目的地&#xff09;。如果命令行中没有列出文件&#xff0c;lpr将从标…

RK3568测试tdd

RK3568测试tdd 一、门禁取包二、烧录三、跑tdd用例四、查看结果参考资料 一、门禁取包 右键复制链接&#xff0c;粘贴下载&#xff1b;解压到文件夹&#xff1b; 二、烧录 双击\windows\RKDevTool.exe打开烧写工具&#xff0c;工具界面击烧写步骤如图所示&#xff1a; 推荐…