double类型占几个字节_MongoDB 中的数据类型

1 JSON 与 BSON

MongoDB 是文档数据库,什么是文档呢?如果你看了之前的文章相信你已经有些概念了,这里的文档不是指 Word、PDF 这样的文档,而是类似 JSON(JavaScript Object Notation) 的对象,由不同的键以及对应的值组成,它的名字是 BSON(Bin­ary JSON)。

BSON 可以理解为 JSON 的扩展,我们先来认识下后者。JSON 是一种轻量的数据交换格式,常用于进程间通信、API 返回结果等方面。看个例子

{
    "name": "xiaoming",
    "age": 18,
    "is_student": true,
    "favorites": ["basketball", "sing"],
    "extra": {
        "height": 180,
        "country": "china"
    }
}

这就是一个 JSON 串,有如下特征

  • 以文本形式存储
  • 支持的简单类数据型:有字符串、数字、布尔值
  • 支持的复合数据类型有:数组、对象
  • 支持的特殊数据类型有:null
  • JSON 的最外层是一个数组或者对象

对于复合类型我做一些说明:

数组,由 0 到多个元素组成,多个中间以逗号隔开,外层使用方括号([])进行包裹,比如 favorites 字段对应的值就是一个数组。数组里面的元素可以是简单类型或者复合类型的一种或多种,也就是说不要求数组里的类型都相同。

对象,由 0 到多个键值对组成,多个中间以逗号隔开,外层使用花括号({})进行包裹,比如 extra 字段对应的值就是一个对象。其中的键只能是字符串,值可以是简单类型或者复合类型。这个例子中 JSON 的最外层也是一个对象。

JSON 轻量、易读,这是它的优势,不过也有些缺陷

  • 支持的类型不是很精确,比如数字,我们无法判定是整型还是浮点型,如果根据有没有小数点来区分,即使判定是整型了,它是 32 位的还是 64 位的我们也无从得知
  • 支持的类型不是很全,比如常用的时间类型没有

这样一来就引入了 BSON,它做了如下扩充

  • 数字支持更准确的类型,对于整型有 int32、int64 等,对于小数有 double、decimal128
  • 引入了 Timestamp、UTC datetime 等其它类型

需要注意的是,BSON 是以二进制形式存储的,所以可读性不高。另外,它的最外层只能是对象。

PS:如果比较好奇 JSON 和 BSON 的规范,可以看下文末的参考链接 1 和 2

2 MongoDB 中常见的数据类型

官方文档 BSON Types 一节(见参考链接 3)中对支持的数据类型列了一个表,我按自己的理解给大家梳理下。

JSON 支持的数据类型,BSON 肯定也支持,所以先用 JSON 去理解其中一部分数据类型

JSON 中的数据类型MongoDB 中的数据类型
简单类型数字-
布尔Boolean
字符串String
复合类型数组Array
对象Object
特殊类型nullNull

BSON 对数字进行了一些扩充,我们记住常见的几个就行

  • 32-bit integer(32 位整数)
  • 64-bit integer(64 位整数)
  • Double(浮点数)
  • Decimal128(小数)

Double 和 Decimal128 有什么差别呢?你可以简单理解为后一种更加准确,前者存储的是一个大概值,后者则是存储一个准确值。比如,同样是 9.99,Decimal128 存储的是准确的,Double 则是存的 9.9900000000000002131628...。一般情况我们使用 Double 没有什么问题,但是在某些对数字准确度有较大要求的场景下就要使用 Decimal128,比如电商、金融行业等。另外,它们所占的存储空间也是不同的,前者是 8 个字节,后者是 16 个字节。

BSON 还扩充了一些类型,我们也挑几个常用的认识下

  • ObjectID

该类型主要用于文档唯一 _id 的生成,长度为 12 个字节

- 前 4 个字节记录的是时间戳
- 中间 5 个字节是随机数
- 后 3 个字节是计数器

MongoDB 3.2 以及之前的版本对于中间 5 个字节的生成策略有些不同:前 3 个是机器 ID,后 2 个是进程 ID。3.2 之后的版本使用的是随机数。

注意:本文在对字节进行前后描述时,前指的是高字节位,后指的低字节位

  • Timestamp

该类型主要用在 MongoDB 程序内部,用于标识操作的先后顺序,长度为 8 个字节

- 前 4 个字节记录的是时间戳
- 后 4 个字节记录的是在同一秒内某个操作的序号,这个序号是递增的,由于同一秒内经常会有多个操作,所以采用这种方式记录
  • Date

应用如果要用到时间类型的话,一般会使用这个数据类型,它的底层其实是一个 64 位的整数,记录的也是时间戳,不过单位是毫秒。

另外说明下,如果你看过 BSON 的规格描述,你会发现 MongoDB 中对于一些类型的命名和 BSON 有些差异。比如,MongoDB 官方文档中 Object 其实和 BSON 中的 document 是同一种数据类型,只是名字不同。我们不用过于纠结这些,只要记住一种命名,比如 MongoDB 官方文档中的,然后知道它代表着什么或者是怎么存的就行了。

如果需要比较全面的了解 MongoDB 中支持的数据类型,请查阅官方文档 BSON Types 一节(参考链接 3)。

3 使用 Compass 查看数据类型

我们打开 Compass,在集合 video.movies 的详情页面,打开 Schema 标签页,点击 ANALYZE 按钮后等待一小会后,我们可以看到文档中各字段值的数据类型

21d20f78f069e0a42607430724559af4.png

列下部分字段的数据类型

  • _id:ObjectId
  • cast:3 种数据类型,有 Array、String 和 Undefined。由于 MongoDB 不会对某个字段的类型做强制要求,也就出现了不同文档同一个字段类型不同的情况。Undefined 表示 cast 字段在某些文档中是不存在的
  • viewerRating:3 种数据类型,有 Double、32-bit integer 和 Undefined

PS:这个小节中,集合的类型信息我都没有列完,大家可以自己使用 Compass 看下,再看下其它集合的一些信息,然后对照前面的介绍熟悉一些常用的数据类型。

需要注意的是,上面的数据类型信息都是取样统计的(一般是取 1000 条,具体信息可以看查询框下的提示信息,比如上图样本量为 1000,总文档量为 963534,比例大概是 0.1%),并非统计的集合中的所有文档,所以不能百分百的保证全面。不过一般情况下这也够了,因为同一个集合中的文档字段大部分是相同的,即使有差异,取样的时候大概率也能取到,所以统计结果还是十分接近于真实情况的。

再看下集合 citibike.trips

d38b01141a82c7422f33751b0f404d40.png

也列下部分字段的数据类型

  • end station location:Object,其中子文档又有 2 个字段
    • coordinates:2 种数据类型,有 Array 和 Double
    • type:String
  • stop time:Date

字段 end station location 有点特殊,它的内容类似这样

"end station location": {
    "type": "Point",
    "coordinates": [-73.99973337, 40.71910537]
}

在 MongoDB 中可以以这种方式存储地理位置信息,type 指地理位置类型,coordinates 则指具体的坐标,这个对象在 MongoDB 中有个名字 GeoJSON object,可以理解为 MongoDB 基于 Object 类型扩展出的新的类型,但这个类型并非 BSON 规范所有。

在 Compass 中我们可以启用地理信息可视化的设置,依次点击菜单项 Help -> Privacy Settings,会有弹窗

f62e1e86f3c048388f017f69dea62987.png

勾选设置 Enable Geographic Visualizations 后,点击 Close 关闭弹窗,最后点击下 ANALYZE 重新生成统计信息

526ded3cda97efa93f71f9e80128f5af.png

可以看到,Compass 对取样的文档中的地理位置进行了可视化。细心的伙伴可能会注意到,字段 end station location 下方展示的类型也从 document 变成了 coordinates,和前面 MongoDB 中的数据类型命名和 BSON 不一致一样,我们不用太纠结命名,知道 coordinates 指的是 GeoJSON object 就行了。

4 小结

本文简单介绍了 BSON,然后介绍了 MongoDB 中常用的 BSON 数据类型,最后借助 Compass 工具对这些类型进行了熟悉。

5 参考

  1. http://bsonspec.org/spec.html
  2. https://www.json.org/json-en.html
  3. https://docs.mongodb.com/manual/reference/bson-types

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

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

相关文章

李德毅院士:未来交通——自动驾驶与智能网联

图片来源:华龙网转自:主线科技(trunktech)近日,中国国际智能产业博览会(智博会)在重庆召开。中国人工智能学会理事长李德毅院士在智博会“人工智能产业发展合作论坛”上,发表了主题为…

C++输入一个整数后接着输入字符串

当我们输入整数,按回车,实际上输入的是:整数和换行符号(\n)。cin把整数读进了,但是换行符号没有读,因此如果接下来输入字符串,即使用cin.getline,首先会读入\n。然后就直接结束了。 下面这个程序需要输入四…

elasticsearch 查看索引_ElasticSearch 索引基本操作

松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring BootVue微人事视频教程ElasticSearch 系列第五篇,和大家聊一聊索引的基本操作,前四篇传送门:打算出一个 ElasticSearch 教程,谁赞成&#…

协作机器人鼻祖“重生”,卷土重来的Rethink能否给行业注入一针强心剂?

来源:机器人大讲堂十年之前,他横空出世,创新颠覆 2008年,美国机器人制造专家,麻省理工学院计算机科学与人工智能实验室创始主任罗德尼布鲁克斯创建了Rethink Robotics公司,他将基于行为的人工智能理论和其在…

HTML基础做出属于自己的完美网页

HTML HTML解释: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记)。相当于定义统一的规则(W3C),大家都来遵守他,这样就可以让浏…

excel进销存管理系统_【实例分享】勤哲Excel服务器做企业进销存财务管理系统...

如今,企业在推进数字化选型的时常有很多焦虑,难以找到合适的产品正是其中之一。正如一家正在挑选信息化管理软件的企业,对信息化产品的理解与厂商提供的产品可能完全不同,企业真正想要的是具备发货管理之类功能完全贴合企业业务需…

C++ multimap的插入

不同于map&#xff0c;multimap不能使用中括号[]法插入&#xff0c;multimap插入的一种简单做法是&#xff1a; multimap.insert({key, value}) int main(){multimap<int, int> mm;mm.insert({ 1, 2 });mm.insert({ 1, 2 });mm.insert({ 1, 3 });mm.insert({ 5, 6 });m…

人类大脑神经如何进化?寄生虫充当了隐形设计师

来源&#xff1a;网易科技自人类诞生以来&#xff0c;寄生虫就从未停止过与我们的相爱相杀&#xff0c;它们不仅改变了某些人类的进化方向和行为&#xff0c;甚至也影响了大脑神经的进化方式&#xff0c;充当着隐形设计师的角色。美国新墨西哥大学心理学家马可德尔吉迪斯(Marco…

hadoop jar包_【大数据学习】Hadoop的MR分布式开发小实战

前提:hadoop集群应部署完毕。一、实战科目做一个Map Reduce分布式开发&#xff0c;开发内容为统计文件中的单词出现次数。二、战前准备1、本人在本地创建了一个用于执行MR的的文件&#xff0c;文件中有209行&#xff0c;每行写了“这是一个测试文件”的句子。2、将该文件上传至…

最新数据:一图看清全球393家独角兽公司

来源&#xff1a;资本实验室据CB Insights最新数据&#xff0c;截至2019年8月底&#xff0c;全球共有393家未上市公司的估值达到或超过10亿美元以上&#xff0c;也就是我们俗称的“独角兽”公司。这些公司的融资总额超过2920亿美元&#xff0c;平均融资额超过7.43亿美元&#x…

它指导了计算机行业大半个世纪的发展,如今却要走下神坛?

来源&#xff1a;托尼前几天&#xff0c;有这样一条新闻。全球最大的芯片代工巨头台积电&#xff0c;其高管力挺摩尔定律&#xff0c;认为这个定律没有消亡&#xff0c;仍然可以通过增加晶体管密度&#xff0c;实现计算性能的提高。事实上&#xff0c;在摩尔定律是否已经失效这…

nodejs+kafka+storm+hbase 开发

1.环境介绍 如图所示&#xff0c;NODEJS做为数据源的的产生者产生消息&#xff0c;发到Kafka队列&#xff0c;然后参见红线&#xff0c;表示本地开发的环境下数据的流向&#xff08;本地开发时&#xff0c;storm topology运行在本地模式&#xff09; 2.搭建环境,我采用的是ecli…

将代码美观地复制到word的网站

http://www.codeinword.com/ 左边是源代码&#xff0c;右边是排版后的代码&#xff0c;复制右边的代码粘贴到word&#xff0c;可以使得word中的代码美观

c# 网口相机可以通过_电脑可以跑安卓9.0了!完全免费

Android早已超过Windows&#xff0c;坐拥全球用户量最大的操作系统宝座。这么高的人气&#xff0c;当然会有很多可玩性&#xff0c;比如Android -x86项目&#xff0c;即在x86处理器平台上运行Android。据悉&#xff0c;底层升级为Android 9 Pie(android-9.0.0_r50)的x86项目已经…

我的runtime学习笔记

0、简介&#xff1a; OC方法不同于C语言函数&#xff0c;属于动态调用过程&#xff0c;在编译的时候并不能决定真正调用哪个函数&#xff0c;只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。 至于其他理论上的东西不必讲太多&#xff0c;编程讲的就是实用性&…

详解工业机器人和机械手臂的区别

来源&#xff1a;工业机器人目前市场上出现许多机械臂&#xff0c;很多小伙伴不能区分机械臂和机器人是不是同一种概念&#xff0c;今天小编和大伙讲解讲解。机械臂是一种机械装置&#xff0c;可以是自动的也可以是人为控制的&#xff1b;工业机器人是一种自动化设备&#xff0…

php 实时监测网站是否异常_网站跳转劫持解决,网站跳转劫持解决方法只有3步...

某一客户单位的网站首页被篡改&#xff0c;并收到网检的通知说是网站有漏洞&#xff0c;接到上级部门的信息安全整改通报&#xff0c;贵单位网站被植入木马文件&#xff0c;导致网站首页篡改跳转到彩票网站&#xff0c;根据中华人民共和国计算机信息系统安全保护条例以及信息安…

大脑通过统计推理表征“自我”

来源&#xff1a; 脑智卓越中心9月3日&#xff0c;《美国科学院院刊》在线发表了题为《猕猴对自我身体表征的统计推理》的研究论文。该研究由中国科学院脑科学与智能技术卓越创新中心&#xff08;神经科学研究所&#xff09;、上海脑科学与类脑研究中心、灵长类神经生物学重点实…

关于未来50年的工作与生活,三星联合未来学家们做出了这些预测

来源&#xff1a;资本实验室8月底&#xff0c;三星公司为庆祝其位于伦敦的新体验空间Samsung KX投入运营&#xff0c;委托英国的几位专家学者和未来学家们共同研究&#xff0c;并发布了一份题为《三星KX50&#xff1a;聚焦未来》的报告。根据该报告的预测&#xff0c;到2069年&…

Samba Linux 和windows 共享

1.安装Samba (yum install Samba) 2.配置Samba &#xff08;Samba的配置文件为/etc/samba/smb.conf&#xff09; 1&#xff09;打开smb.conf vim /etc/samba/smb.conf 2)将文件中的内容做如下相应修改&#xff1a;    #securityuser 后面添加&#xff1a; secur…