前言

MongoDB存储类型为BSON类型,BSON类型可以理解为JSON类型的扩展,

BSON(/ˈbiːsən/)是一种计算机数据交换格式,主要被用作MongoDB数据库中的数据存储和网络传输格式。它是一种二进制表示形式,能用来表示简单数据结构、关联数组(MongoDB中称为“对象”或“文档”)以及MongoDB中的各种数据类型。BSON之名缘于JSON,含义为Binary JSON(二进制JSON)。



MongoDB数据类型BSON

  • 前言
  • 1 对象编号
  • 2 字符串
  • 3 时间戳
  • 4 日期
  • 5 比较/排序顺序


1 对象编号

BSON是一种二进制序列化格式,用于在MongoDB中存储文档和进行远程过程调用。

ObjectId很小,很可能是唯一的,可以快速生成并排序。ObjectId值的长度为12个字节,包括:

  • 一个4字节的时间戳记值,代表自Unix时代以来以秒为单位的ObjectId的创建
  • 5字节随机值
  • 3字节递增计数器,初始化为随机值
    虽然BSON格式本身是低位字节序,但时间戳和计数器值却是高位字节序,最高有效字节出现在字节序列中。

在MongoDB中,存储在集合中的每个文档都需要一个唯一的 _id字段作为主键。如果插入的文档忽略该_id字段,则MongoDB驱动程序会自动为该字段生成一个ObjectId_id。

这也适用于通过upsert:true通过更新操作插入的文档。

MongoDB客户端应添加一个_id具有唯一ObjectId 的字段。在该_id字段中使用ObjectIds还可以带来以下好处:

  • 在mongoshell中,您可以ObjectId使用ObjectId.getTimestamp()方法访问的创建时间。
  • 在_id存储ObjectId值的字段上进行排序大致相当于按创建时间进行排序。

重要
尽管ObjectId值应随时间增加,但不一定是单调的。这是因为他们:
仅包含一秒的时间分辨率,因此 在同一秒内创建的ObjectId值没有保证的顺序,并且
由客户端生成,客户端可能具有不同的系统时钟。

2 字符串

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

给定使用UTF-8字符集的sort()字符串,在字符串上使用将是相当正确的。但是,由于内部 sort()使用C ++ strcmpAPI,因此排序顺序可能会错误地处理某些字符。

3 时间戳

BSON有一个特殊的时间戳类型内部MongoDB的使用,不与常规相关的日期类型。此内部时间戳记类型是64位值,其中:

  • 最重要的32位是一个time_t值(自Unix时代以来的秒数)
  • 最低有效32位是ordinal给定秒内的操作增量。

尽管BSON格式是低位优先的,因此首先存储了最低有效位,但是无论字节序如何,该mongod实例始终在所有平台上time_t先比较该值ordinal。

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

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

注意
BSON时间戳类型供内部 MongoDB使用。在大多数情况下,在应用程序开发中,您将需要使用BSON日期类型。

插入包含带有空时间戳值的顶级字段的文档时,MongoDB会将空时间戳值替换为当前时间戳值,但以下情况除外。如果_id 字段本身包含空的时间戳记值,则将始终按原样插入而不替换它。

插入带有空时间戳值的文档:

db.test.insertOne( { ts: new Timestamp() } );

db.test.find() 然后,运行将返回类似于以下内容的文档:

{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }

服务器已将ts插入时的时间戳记值替换为空时间戳记值。

4 日期

BSON Date是一个64位整数,代表自Unix时代(1970年1月1日)以来的毫秒数。这导致过去和将来的可表示日期范围约为2.9亿年。

BSON规格 指的是BSON Date类型为UTC日期时间。

BSON日期类型已签名。表示1970年之前的日期。

在外壳中使用构造函数 构造一个Date :new Date()mongo

var mydate1 = new Date()

ISODate()在mongo shell中使用构造函数 构造一个Date :

var mydate2 = ISODate()

Date以字符串形式返回值:

mydate1.toString()

返回日期值的月份部分;月是零索引,因此一月是月0:

mydate1.getMonth()

5 比较/排序顺序

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

  1. MinKey(内部类型)
  2. 空值
  3. 数字(整数,双精度数,小数)
  4. 符号,字符串
  5. 宾语
  6. 数组
  7. BinData
  8. 对象编号
  9. 布尔型
  10. 日期
  11. 时间戳记
  12. 正则表达式
  13. MaxKey(内部类型)

数值类型

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

字符串

二进制比较 默认情况下,MongoDB使用简单的二进制比较来比较字符串。

整理

归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。

整理规范具有以下语法:

{
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

指定排序规则时,该locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见整理文档。

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

数组

对于数组,小于比较或升序排序比较数组的最小元素,大于或降序排序比较数组的最大元素。这样,当将值是单元素数组(例如)的字段与非数组字段(例如)进行比较时,比较是和之间的 。空数组(例如)的比较将空数组视为小于或缺少字段。[ 1 ] 2 1 2 [ ] null

对象

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

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

日期和时间戳

日期对象在时间戳对象之前排序。

不存在的字段

比较将不存在的字段视为空BSON对象。因此,在一种a在文档领域,并会处理的文件等同于排序顺序。{ }{ a: null }

BinData

MongoDB按BinData以下顺序排序:

  • 首先,数据的长度或大小。
  • 然后,按BSON的一字节子类型。
  • 最后,通过数据执行逐字节比较。