Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MongoDB基础之BSON数据类型

MongoDB基础之BSON数据类型

作者头像
云飞扬
发布于 2019-09-24 03:51:38
发布于 2019-09-24 03:51:38
9.5K00
代码可运行
举报
文章被收录于专栏:星汉技术星汉技术
运行总次数:0
代码可运行

MongoDB基础之BSON数据类型

本博客参考MongoDB4.2官方文档。

MongoDB的文档类似于JSON,JSON是一种简单的额表示数据的方式,仅包含6种数据类型,分别是:null、布尔、数字、字符串、数组和对象。

虽然这些类型的表现已经足够强大,但是对于绝大多数应用来说还需要另外一些不可或缺的类型。例如,日期类型、数字类型(只有一种,没法区分整型和浮点)、正则表达式等。

MongoDB在保留JSON基本的键值对特性的基础上,添加了其他一些数据类型。在不同的编程语言下这些类型的表示有些差异。 下面列出MongoDB通常支持的一些类型,同时说明了在shell中这些类型的表示方法。

每种BSON类型都具有整数和字符串标识符,如下表所示:

类型

整数

别名

备注

说明

Double

1

double

shell中的数字类型

64位浮点数

String

2

string

字符串类型

Object

3

object

对象类型

Array

4

array

数组类型

Binary data

5

binData

shell中不可用

二进制数据类型

Undefined

6

undefined

已过时

未定义类型

ObjectId

7

objectId

对象id类型

Boolean

8

bool

布尔类型

Date

9

date

日期类型

Null

10

null

用于表示空值或者不存在的字段

Regular Expression

11

regex

正则表达式类型

DBPointer

12

dbPointer

已过时

JavaScript

13

javascript

JavaScript代码

Symbol

14

symbol

shell中不可用,已过时

JavaScript(with scope)

15

javascriptWithScope

带作用域的JavaScript代码

32-bit integer

16

int

shell中不可用

32位整数

Timestamp

17

timestamp

时间戳类型

64-bit integer

18

long

shell中不可用

64位整数

Decimal128

19

decimal

3.4版本新增

Min key

-1

minKey

shell中无此类型

最小键

Max key

127

maxKey

shell中无此类型

最大键

一、类型详解

下面针对一些常用的数据类型进行详细说明。

1、Double(64位浮点数)

shell中的数字都是这种类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ “x” : 3.14 }
{ “x” : 3 }

2、String(字符串)

BSON字符串是UTF-8。通常,在序列化和反序列化BSON时,每种编程语言的驱动程序都会从语言的字符串格式转换为UTF-8。可以轻松地将大多数国际字符存储在BSON字符串中。此外,MongoDB的$regex查询在正则表达式字符串中支持UTF-8。

字符串类型可以使用sort()方法进行排序,但是sort()是由C++的strcmpAPI实现的,排序可能会错误的处理某些字符。

3、Array(数组)

数组是一组值,既可以既可以偶组为有序对象来操作,也可以作为无序对象操作。

数组可以包含不同数据类型的元素,实际上,常规键值对支持的值都可以作为数组的元素,甚至是套嵌数组。

文档中的数组有个特性,就是MongoDB能理解其结构,并指导如何深入数组内部对其内容进行操作。这样就能用内容对数组进行查询和构建索引了。

MongoDB可以使用原子更新修改数组中的内容。

值的集合或者列表可以表示成数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ “x” : [“a”, “b”, “c”]}

4、Binary data(二进制数据)

二进制数据可以由任意字节的串组成。不过shell中无法使用。

5、Undefined(未定义)

文档中也可以使用未定义类型undefined。4.2版本中已经显示过时。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ “x” : unddefined }

6、ObjectId

ObjectId使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。

在早期版本中,这些字节是有特定的结构的:开头的4个字节是标准的Unix时间戳,编码了从新纪元开始的秒数;接下来的3个字节存储了机器ID;随后则是2个字节的进程ID;最后3个字节存储了进程局部的计数器,每次生成对象ID计数器都会加1。时间戳、机器ID和进程ID组合起来,提供了秒级别的唯一性。时间戳在前,意味着ObjectId大致会按照插入的顺序排序。可以将其作为索引提高效率,但不是绝对的,只是大致。这4个字节也隐含了文档创建的时间,绝大多数驱动都会公开一个方法从ObjectId获取这个信息。前9个字节保证了同一秒不同机器不同进程产生的ObjectId是唯一的,后3字节就是一个自动增加的计数器,保证了相同进程同一秒产生的ObjectId也是不一样的。同一秒钟允许每个进程拥有2563(16777216)个不同的ObjectId。

当前4.2版本中是这样介绍的,ObjectId各个段含义如下:

前4个字节的值,表示自Unix纪元以来的秒数。中间5个字节是随机值。最后3个字节是计数器,以随机值开始。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{“x” : objectId() }

使用ObjectId有以下两个优点:

  • 1.在MongoDB shell中可以使用该ObjectId.getTimestamp()方法访问创建时间。
  • 2._id存储的ObjectId值的排序大致是按创建时间排序的。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> ObjectId("5b4c65a07a88f6e8893b70ef").getTimestamp()
ISODate("2018-07-16T09:30:08Z")

MongoDB中存储的文档必须有一个“_id”键,这个键可以是任何类型的,默认是ObjectId对象。在一个集合中,每个文档都有唯一的“_id”值,来确保集合里面每个文档都能被唯一标识。此唯一是在一个集合中保证全局唯一的。

ObjectId是“_id”的默认类型。它设计成轻量型,不同的机器都能用全局唯一的同种方法方便地生成它。这是MongoDB采用这种类型的主要原因。

如果插入文档的时候没有“_id”键,系统会自动创建一个。这件事可以由MongoDB服务器来做,也可以在客户端由驱动程序完成。

通常会将自动生成_id放在客户端让驱动程序来完成,理由如下:

  • 1.ObjectId的生成是有开销的,在客户端生成可以减少数据库扩展的负担。
  • 2.在客户端生成ObjectId,驱动程序能够提供更加丰富的API

7、Boolean(布尔)

布尔类型有两个值true和false。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ “x” : true }

8、Date(日期)

日期类型存储的是从标准纪元开始的毫秒数,不存储时区。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{“x” : new Date() }

日期类型存储的日期大概为2.9亿年。毫秒数为负值,表示1970年之前的日期。

在JavaScript中,Date对象用做MongoDB的日期类型,创建一个新的Date对象时,调用new Date()而不是Date()。调用Date()实际上会返回对日期的字符串表示,而不是真正的Date对象。这不是MongoDB的特性,而是JavaScript本身的特性。

如果使用错误,就会导致日期和字符串混淆,字符串和日期不能互相匹配,最终会给删除、更新、查询等很多操作带来问题。

shell中的日期显示时使用本地时区设置。日期在数据中是以标准纪元开水的毫秒数的形式存储的,没有与之相关的时区信息。

9、Null

null用于表示空值或者不存在的字段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{“x” : null }

10、Regular Expression(正则表达式)

文档中可以包含正则表达式,采用JavaScript的正则表达式语法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ “x” : /foobar/i }

11、JavaScript代码

文档中还可以包含JavaScript代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{“x”: function() { /*…*/} }

12、Symbol(符号)

shell不支持这种类型。shell将数据库里的符号类型转换成字符串。现在已经过时。

13、Timestamp(时间戳)

BSON有一个MongoDB内部使用的特殊的时间戳类型,和常的日期类型没有关系。

时间戳记值是64位值,其中:前32位是一个time_t值(自Unix时代以来的秒数),后32位是ordinal给定秒内操作的增量。

在单个mongod实例中,时间戳记值始终是唯一的。

在复制中,操作日志具有一个ts字段。该字段中的值反映了使用BSON时间戳值的操作时间。

注意时间戳类型只是在MongoDB内部使用。开发过程中使用的是日期类型。

14、数字

32-bit integer(32位整数)

shell中这个类型不可用,因为JavaScript仅支持64位浮点数,所以32位整数会被自动转换为为64位浮点数。

64-bit integer(64位整数)

shell中也不支持这个类型,shell中会使用一个特殊的内嵌文档来显示64位整数。

Double(64位浮点数)

JavaScript中只有一种数字类型。MongoDB中有3种数字类型,shell必须绕过JavaScript的限制。默认情况下,shell中的数字都被MongoDB当作是双精度数。这就意味着如果从数据库张总获得一个32位整数,修改文档后,将文档存回数据库的时候,这个整数也被转换成了浮点数,即便是保持这个整数原封不动存回去,也是这样的。所以尽量不要在shell下覆盖整个文档。

数字只能表示为双精度数,有些64位的整数并不能精确地表示为64位浮点数。所以要是存入一个64位整数,然后在shell中查看,它会显示一个内嵌文档,表示可能不准确。

例如,在集合中存入一个文档(不是在shell模式下存入的),其中myInterger键的值设为一个64位整数3,然后在shell中查看,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>doc = db.nums.findOn();
{
	“_id” : ObjectId(“4c0beecfd096a2580fe6fa08”),
	“myInteger” : {
	“floatApprox” : 3
}
}

内嵌文档只表示shell显示的是一个64位浮点数近似表示的64位整数,若内嵌文档只有一个键的话,实际上这个值是准确的。

要是插入的64位整数不能精确地作为双精度数显示,shell会添加两个键,分别是“top”(表示高32位)和“bottom”(表示低32位)。

例如,插入9223372036854775807,shell显示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>doc = db.nums.findOn();
{
	“_id” : ObjectId(“4c0beecfd096a2580fe6fa10”),
	“myInteger” : {
	“floatApprox” : 9223372036854776000,
	“top” :2147483647,
	“bottom” : 4294967295
}
}

floatApprox是一种特殊的内嵌文档,可以作为值和文档来操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>doc.myInteger.floatApprox
3
> doc.myInteger + 1
4

15、Man key(最大值)

BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。

16、Min key(最小值)

BSON包括一个特殊类型,表示可能的最小值。shell中没有这个类型。

二、类型之间的比较和排序

比较不同BSON类型的值时,MongoDB使用以下比较顺序,从最低到最高:

MinKey(内部类型)、Null、数字(整数,整数,双精度数,小数)、符号,字符串、Object、数组、BinData、ObjectId、布尔、日期、时间戳、正则表达式、MaxKey(内部类型)

1、数值类型

为了进行比较,MongoDB将这些类型视为等效的,在进行比较之前,先将数字类型进行转换。

2、字符串

二进制比较法

默认情况下,MongoDB将字符串转换成二进制来进行比较。

Collation

Collation是3.4版本的新功能,Collation允许用户为字符串比较指定特定的语言规则。

Collation具有以下语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

指定排序规则时,该locale字段为必填字段;所有其他排序规则字段都是可选的。

locale

用来选择语言环境,官方提供了全球很多国家的语言,在其中可以看到中文的选项值为zh,英文的值为en。其他值的选项,如下:

Locale

caseFirst

alternate

normalization

backwards

zh

off

non-ignorable

FALSE

FALSE

en

off

non-ignorable

FALSE

FALSE

默认排序规则参数值取决于语言环境。以下默认参数在所有语言环境中都是一致的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
caseLevel : false
strength : 3
numericOrdering : false
maxVariable : punct

如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。

3、Arrays

对于数组,小于比较或升序排序比较的是数组中的最小元素,大于比较或降序排序比较的是数组中的最大元素。

当字段是单元素数组与非数组字段进行比较时,比较的是数组的元素和非数组字段的值。空数组参与比较的话,会将空数组视为小于null或缺少此字段。

4、Objects

MongoDB对BSON对象的比较使用以下顺序:

  • 1.按照键值对在BSON对象中出现的顺序递归比较它们。
  • 2.比较关键字段名称。
  • 3.如果关键字段名称相等,则比较字段值。
  • 4.如果字段值相等,则比较下一个键/值对(返回步骤1)。没有下一个字段的对象小于有下一个字段的对象。

5、日期和时间戳

在3.0.0版本中进行了更改,将日期对象放在时间戳对象之前排序。

在早期的版本中是将两种对象放在一起进行比较的。

6、不存在的字段

MongoDB将不存在的字段视为是空的BSON对象。

例如:{}和{a : null}进行比较,那么在比较的时候,a字段和空文档将视为等价的。

7、BinData

MongoDB按BinData以下顺序排序:

  • 首先,比较数据的长度或大小。
  • 然后,按BSON的一字节子类型进行比较。
  • 最后,根据数据执行逐字节比较。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB :第三章:MongoDB的数据类型与创建MongoDB数据库
在MongoDB数据库中名字空间 .system.* 是包含多种系统信息的特殊集合(Collection),如下:
马克社区
2023/03/02
9570
Bson类似于Protocol Buffer的数据形式,比json更轻量级更高效
BSON是Binary JSON的缩写,是一种类json的一种二进制形式的存储格式。 它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON在JSON基础上进行了一些数据类型的扩展,如Date和BinData类型。
AWeiLoveAndroid
2019/07/25
3K0
Bson类似于Protocol Buffer的数据形式,比json更轻量级更高效
MongoDB(6)- BSON 数据类型
到时候想通过 $type 来指定某个数据类型的时候可以用序号,而不用敲完整的字符串
小菠萝测试笔记
2021/06/09
1.3K0
MongoDB(6)- BSON 数据类型
MongoDB 相关概念
传统的关系型数据库(如MySQL),在数据操作的“三高”需求以及应对Web2.0的网站需求面前,显得力不从心。 解释:“三高”需求:
用户9615083
2022/12/25
1.5K0
MongoDB 相关概念
MongoDB :第三章:MongoDB的数据类型与创建MongoDB数据库
在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:
Java廖志伟
2022/09/28
1.1K0
MongoDB :第三章:MongoDB的数据类型与创建MongoDB数据库
MongoDB基本数据类型
版权声明:本文为博主原创文章,未经博主允许不得转载。 String : 这是最常用的数据类型来存储数据。在MongoDB中的字符串必须是有效的UTF-8。 Integer : 这种类型是用来存储一个数值。整数可以是32位或64位,这取决于您的服务器。 Boolean : 此类型用于存储一个布尔值 (true/ false) 。 Double : 这种类型是用来存储浮点值。 Min/ Max keys : 这种类型被用来对BSON元素的最低和最高值比较。
DencyCheng
2018/11/05
6320
MongoDB数据类型
上篇文章我们介绍了MongoDB的最基本的增删改查操作,也介绍了一些基础的概念,MongoDB中每条记录称作一个文档,这个文档和我们平时用的JSON有点像,但也不完全一样。JSON是一种轻量级的数据交换格式。简洁和清晰的层次结构使得JSON成为理想的数据交换语言,JSON易于阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,但是JSON也有它的局限性,比如它只有null、布尔、数字、字符串、数组和对象这几种数据类型,没有日期类型,只有一种数字类型,无法区分浮点数和整数,也没法表示正则表达式或者
江南一点雨
2018/04/02
1.1K0
MongoDB数据类型
003.MongoDB主要概念
一个MongoDB可以建立多个数据库,MongoDB默认数据库为"db",该数据库存储在data目录中。
木二
2019/07/01
1.4K0
mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改
mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改 Mongodb并不提供Alter table这样的语句或者工具修改字段类型,只能写程序转。 数据类型 基本数据类型   MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型.与数据库打交道的那些应用。例如,JSON没有日期类型,这会使得处理本来简单的日期问题变得非常繁琐。只有一种数字类型,没法区分浮点数和整数,更不能区分32位和64位数
学到老
2018/03/19
2.2K0
mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改
MongoDB入门
mongodb与关系型数据库概念类比 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 tablejoins 表连接,MongoDB不支持 primary key _id 主键,MongoDB自动将_id字段设置为主键 文档与记录行的区别 文档是无模式的,即第一条记录5个字段,第2条记录可能是2
字母哥博客
2020/09/23
1.5K0
MongoDB的数据类型(一)
MongoDB是一种NoSQL数据库,具有灵活的数据模型。在MongoDB中,文档是最基本的数据单元,它可以包含任意数量的字段和嵌套文档。
堕落飞鸟
2023/05/09
4220
Python爬虫之mongodb的简单使用
mongodb的简单使用 学习目标 掌握 服务端的启动 掌握 客户端的使用 掌握 mongodb的数据库和集合命令 了解 文档中的_id字段 ---- 1. mongodb服务端的启动 默认端口:27017 默认配置文件的位置:/etc/mongod.conf 默认日志的位置:/var/log/mongodb/mongod.log mongodb服务端启动分别两种方式: 本地测试方式的启动(只具有本地数据增删改查的功能) 生产环境启动(具有完整的全部功能) 1.1 测试方式启动 启动: sudo servi
海仔
2020/09/23
5930
MongoDB的数据类型
MongoDB的数据类型 基本数据类型 null:用于表示空值或者不存在的字段,{“x”:null} 布尔型:布尔类型有两个值true和false,{“x”:true} 数值:shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。这里不用下面整型特有表示都被识别为浮点型 对于整型值,可以使用 NumberInt(4字节符号整数)或NumberLong(8字节符号整数) {“x”:NumberInt(“3”)} {“x”:NumberLong(“3”)} 字符串:UTF-8字符串都可以
名字是乱打的
2022/05/13
6320
MongoDB系列之MongoDB基本概念
MongoDB是一个基于分布式文档存储的非关系型数据库系统,使用C++语言编写,采用一种类似json的数据结构BSON存储。它是由字段和值对组成的数据结构。可以应用于大量数据的存储。MongoDB是一种最像关系型数据库的非关系型数据,也可以支持索引等功能。
SmileNicky
2022/06/15
5960
01 . MongoDB简介及部署配置
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
iginkgo18
2020/09/27
1.8K0
01 . MongoDB简介及部署配置
MongoDB 介绍
郭顺发
2023/07/17
1400
MongoDB
传统的关系型数据库(如MySQL),在数据操作的“三高”需求以及应对Web2.0的网站需求面前,显得力不从心 解释:“三高”需求:
JokerDJ
2023/11/27
2710
MongoDB
玩转mongodb(二):mongodb基础知识
常用基本数据类型:nullnull用于表示空值或者不存在的字段:{"data":null}布尔型布尔类型只有两个值,true和false:{"data":true}、{"data":false}字符串字符串类型的数据是由UTF-8字符组成:{"data":"pingan"}正则表达式查询时,使用正则表达式作为限定条件,语法和javascript的正则表达式一样:{"data":/pingan/i}对象id对象id是一个12字节(24字符)的ID,是文档的唯一标识。{"data":ObjectId()}数值s
壮壮熊
2022/08/18
7540
玩转mongodb(二):mongodb基础知识
BSON及mongoDB数据类型
//字符型,存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的
Leshami
2018/08/13
1.4K0
mongodb存储的数据类型(redis存储数据类型)
文档(document)是MongoDB中数据的基本存储单元,非常类似与关系型数据库管理系统中的行,当更有表现力。
全栈程序员站长
2022/07/29
3.8K0
mongodb存储的数据类型(redis存储数据类型)
相关推荐
MongoDB :第三章:MongoDB的数据类型与创建MongoDB数据库
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验