MONGODB mongodb 一般人不知道的数据类型与使用

2023/6/5 22:30:11

4bd7a27ab203794ff1b32c0591b314ef.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共600人左右 1 + 2)。

MONGODB 在使用中,出现的问题比较少,不少开发者本身并不注意,大多数对于MONGODB 的数据类型的认知并不多,而我们在mongodb的运营中发现开发基本上就是在使用string 类型的方式。

String 类型

这是开发大多数最常用的格式,与JAVA 里面的数据类型一样,STRING 类型。这里MONGODB 的数据存储中使用BSON 通过UTF-8 来进行存储。

在这里有一些在MONGODB中的设计者,认为既然MOGNODB可以在键值方面每个document 的key value 都是自由的,那么如果我一个collection中的一部分是 string 类型,一部分是其他的类型,我们怎么来区别。实际上我们遇到了这样的问题。

fa4fe558acc81f439bbd68f4a05df647.png


db.test.find({"name":{$type:"string"}})

178a927ba626a66abf58bd3022babf87.png


这样我们就可以查出,当前test collection中的所有name 是string类型的documents. 比如我们查询 string 里面的null

242d917cc740889da5d1b4d5c1601d35.png

那么除了这些以外,还有开发经常忽略的一些数值类型,如 int  , long 两种类型,而这两种的类型是有范围的,这里两种的类型会进行自动的切换,如果你的值超过int 会进入到 long 的类型中进行存储。

int| -2,147,483,648 to 2,147,483,647|  0 to 4,294,967,295             |

 
long| -9,223,372,036,854,775,808 to  |  0 to 18,446,744,073,709,551,615
9,223,372,036,854,775,807
插入相关的数据

db.test.insertOne({age: -2147483648})

db.test.insertOne({age: -9223372036854775808})

db.test.insertOne({age: 4294967295 })

db.test.insertOne({age: 18446744073709551615})

db.test.insertOne({age: 28446744073709551615})

实际上我按照上面的范围进行插入数据,则这些数据的类型是double 而不是我们范围中的 INT LONG 等

6586f7adb58a7bc8d93e5b966f5f7179.png

写到这里问题就来了,我想使用INT 类型在MONGODB 中表达数据,怎么办,因为我们在怎么使用这个部分,结果都是DOUBLE

这就要求我们在写入数据的情况下,指定你的数据类型,如INT

eaa1fedf9a62ad3899e6f810d1df2928.png

> db.test.find({"age": {$type: "int"}})

{ "_id" : ObjectId("63c674c2d0c9b3cc56fc047b"), "age" : 18 }

>  

> db.test.insertOne({age: NumberInt("19.03")})

{

"acknowledged" : true,

"insertedId" : ObjectId("63c67638d0c9b3cc56fc047c")

}

> db.test.find({"age": {$type: "int"}})

{ "_id" : ObjectId("63c674c2d0c9b3cc56fc047b"), "age" : 18 }

{ "_id" : ObjectId("63c67638d0c9b3cc56fc047c"), "age" : 19 }

如果你固定了使用的具体的数据类型,你输入的数据与类型不匹配,将被修改为你设定的类型。但是如果你超过你指定的数据类型的范围,那么输入的数据将变得是错误的数据,这点需要使用者注意。

236ba91061317104d2e696d4e27f64e4.png

> db.test.insertOne({age: NumberLong("10294967295")})

{

"acknowledged" : true,

"insertedId" : ObjectId("63c67775d0c9b3cc56fc0480")

}

> db.test.find({"age": {$type: "long"}})

{"_id":ObjectId("63c67766d0c9b3cc56fc047f"),"age":NumberLong("6294967295") }

{"_id":ObjectId("63c67775d0c9b3cc56fc0480"),"age":NumberLong("10294967295") }

3e68aa6fda3e4f13da600deab4c03a41.png

所以官方文档说明的数据部分,可能你在理解上如果出现问题,会导致你的输入的数据的类型和你希望的类型是不一致,甚至你认为数据库可以进行维度的转换也是错误的。

这里就会出现一个核心的问题,你发现的mongodb 的collection 几经了不同的开发人员,一部分数据是 STRING 一部分是INT ,那么你该怎么办。

>  db.test.update({}, [ {$set:{ "age" : {$toDouble: "$age"}}} ], {multi:true})

WriteResult({ "nMatched" : 17, "nUpserted" : 0, "nModified" : 9 })

def3b5f67380f562e9e1b1428f2e63d6.png

1e2d9d8febbd29b3354c139baf8ea6a4.png

但是如果是想转换成INT 则会报错,原因还是转换的值超过了INT的范围16436c54dd69219e71facbe8de9a0b6d.png

这里有一个问题,关于MONGODB ,到底MOGNODB 是都使用STRING 类型好,还是应该使用MONGODB 自有的数据类型。可以去下面的连接来看看一些回答。

而MONGODB 的数据类型应该怎么用,这仅仅是一个开端,更深入的数据类型的研究还应该继续。

01eac15aa680cd71301750fd0902671b.png


http://www.jnnr.cn/a/369124.html

相关文章

【C语言】实现动态版通讯录

💌内容专栏:【C语言】进阶部分 💌本文概括: 结合自定义类型、动态内存管理知识,对静态版本的通讯录进行优化。 💌本文作者:花 碟 💌发布时间:2023.4.2 目录 前言&#x…

lwip中线程优先级的分配原则

lwip的线程 lwIP是一个嵌入式TCP/IP协议栈,它主要包含以下几个线程: 主线程(Main Thread):它是lwIP的主线程,用于初始化lwIP协议栈和各种网络接口,并提供处理网络事件的主循环。主线程的优先级…

PHP+SQL考勤系统安全性的设计与实现

第一章 概 述 1.1 PHP的概念 PHP: Hypertext Preprocessor (超文本预处理器) 的缩写,它是一种服务器端的 HTML 脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言 PHP是一种功能强大…

docker安装以及springboot项目打包运行

我们都知道docker是一个非常好用的虚拟化容器,所谓虚拟化容器其实就是说可以将各个应用都隔离开来,每个应用都可以有自己的独立的运行时环境,这对于我们程序开发是非常有好处的,可以不需要去配置环境,每个组件都有独立…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(三)

如图1所示是USB2.0/RS232/ETH控制并行DAC输出任意频率正弦波、梯形波、三角波、方波的整体设计示意图,可以看到上位机通过RS232串口、ETH千兆网口以及USB2.0接口和FPGA建立通信,通过不同的接口发送报文,FPGA在指令解析模块中把相关设置和参数…

栈和队列OJ题合集(包含循环队列的两种实现)

目录 一:前言 二:有效的括号(括号匹配) 三:用队列实现栈 四:用栈实现队列 五:设计循环队列 一:前言 对栈和队列的基本性质和实现有问题的可以看上一期 链接:http://t.csdn.cn/YQMBA​​​​ 注意:本文用数据的大小来表示入栈入队的先后。 二:有效的括号(括号匹配…

networkx 2-hop邻居(Ego graph)节点

1 Ego graph的简单介绍 自我网络(Ego graph)是一种特殊类型的网络,由一个中心节点和所有直接与之相连的其他节点组成。 中心节点被称为 自我(ego),而与之直接相连的其他周围节点被称为 分身( alters)。 自我网络大多用于分析社会联系、链接和关系。下…

带刷,带刷,刷起来!!!

A:::::::::::::::::::通电(最小生成树,Prim,Kruskal) 题目描述 2015 年,全中国实现了户户通电。作为一名电力建设者,小明正在帮助一带一路上的国家通电。 这一次,小明要帮助 n 个村庄通电&am…

C的实用笔记37——几种常用的字符串处理API(二)

6.字符串拼接函数 0、知识点: 内存污染(存储字符串的目的内存不够用时,后面的内存会被污染,也就是被修改,类似于下标越界) strcat其实就是另一种形式的strcpy,一个从末尾开始复制,一…

[计算机图形学]着色,布林-冯着色模型,着色频率(前瞻预习/复习回顾)

一、前言 到目前为止的前几篇文章已经向大家介绍了从MVP变换到屏幕映射到光栅化的过程,但是仅仅这些还不能让我们很好的模拟真实的世界,究其原因是上面的所有过程都没有涉及光线的运算,而缺少了光也就缺少了明暗的变化,导致渲染出…

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明01. Twitter的推荐系统是什么样的?02. Candidate Sources2.1 In-Network Source2.2 Out-of-Network Sources03. Ranking04. Heuristics, Filters, and Prod…

[综]Review of bike-sharing system studies using bibliometrics method

Review of bike-sharing system studies using bibliometrics method 文献计量学方法在自行车共享系统研究中的应用 article{2022reviewbikesharing, title {Review of bike-sharing system studies using bibliometrics method}, journal {Journal of Traffic and Transport…

Spring源码分析-Bean创建流程四

目录 目录 一、前言 二、Bean实例化构造器的选择 1、createBeanInstance方法解读 2、autowireConstructor 二、BeanPostProcess四个实现中的哪里会用到 Autowired注解构造使用注意 三、实例化几种策略 1、instantiateBean入口 2、获取实例化策略并且进行实例化操作主要有…

vue尚品汇商城项目-day04【25.面包屑处理关键字】

文章目录25.面包屑处理关键字25.1面包屑处理关键字25.2面包屑处理品牌信息25.3平台售卖属性的操作25.面包屑处理关键字 25.1面包屑处理关键字 (1)动态开发面包屑中的分类名 变成式导航路由跳转【自己跳自己】 (2)动态开发面包…

(Cont.) OpenPose OpenCV Caffe QT

Cont. conda deactivate Remember to deactivate conda before compiling conda deactivatecaffe colas.h Path: openpose/3rdparty/caffe/include/cblas.h Case 1: 如果没有 寻找一下 (大概率在python directory有)复制过来即可 exactly寻找命令&am…

C语言 —— 数组

一维数组与二维数组前言一、 一维数组1.1 一维数组定义和使用1.2 例子 :列出0-9的数字1.3 一维数组的初始化1.4 数组名二、二维数组2.1 二维数组的定义2.2 例题:一个学习小组有 5 个人,每个人有 3 门课程的考试成绩,求该小组各科的…

javaScript蓝桥杯----偷梁换柱

目录一、介绍二、目标三、代码四、知识点1. Object.defineProperty五、答案一、介绍 随着医疗水平的进步,人的平均寿命在慢慢提升。现在全球平均预期寿命是 73.2 岁,而在 1950 年则只有 47 岁。那么人类的寿命有极限吗?根据最新的研究&#…

用户体验设计中的颜色

🔥1 颜色模型是一种抽象的用于描述颜色被定义和呈现方式的数学模型。RGB模型(加色模式)最多用于显示器上,因为它是发光的颜色。CMYK模型(减色模式)适用于印刷体,不会发光而是反光的模式&#x1…

全网最详细的nodejs卸载和安装教程

因为项目需求,重装了3个版本的node.js,记录下完整过程,少走弯路少查资料。 一、卸载 1、Win菜单中找到Node.js的卸载程序,运行卸载程序。 2、点击是。 3、等待卸载完成。 4、删除C:\Users\用户名\AppData\Roaming目录下的npm和…

Linux使用:环境变量指南和CPU和GPU利用情况查看

Linux使用:环境变量指南和CPU和GPU利用情况查看Linux环境变量初始化与对应文件的生效顺序Linux的变量种类设置环境变量直接运行export命令定义变量修改系统环境变量修改用户环境变量修改环境变量配置文件环境配置文件的区别profile、 bashrc、.bash_profile、 .bash…