BSON
一、认识
BSON 是一种二进制序列化格式,用于在 MongoDB
中存储文档和进行远程过程调用。
二、数据类型
2.1 int
$type: "int"
表示 32
位 整型数据
2.2 bool
$type: "bool"
表示布尔值
2.3 date
$type: "date"
是一个 64
位整数,它表示自 UNIX
纪元(1970
年 1
月 1
日)以来的毫秒数。因此,过去与未来的可表示日期范围便可达到约 2.9 亿年。
2.4 null
$type: "null"
2.5 long
$type: "long"
表示 64
位整数
2.6 array
$type: "array"
2.7 regex
$type: "regex"
2.8 double
$type: "double"
表示 64
位带符号浮点数
2.9 minKey
$type: "minKey"
2.10 maxKey
$type: "maxKey"
2.11 string
$type: "string"
字符串, UTF-8
编码。
2.12 object
$type: "object"
2.13 number
$type: "number"
表示 Int 32
位整型数据、Long 64
位整型数据、Double
浮点数据、Decimal128
数据
2.14 binData
$type: "binData"
2.15 decimal
$type: "decimal"
表示基于十进制的 128
位高精度浮点数,它们模拟了精确的十进制舍入。此数据适用于处理货币数据(例如财务、税收和科学计算)的应用程序。Decimal128BSON
类型使用 IEEE 754
十进制 128
浮点编号格式,支持 34
个十进制数字(即 有效数字),指数范围为 −6143
到 +6144
。
2.16 objectId
$type: "objectId"
对象标识符, 可能是唯一的,生成速度快并且是有序的。ObjectId
值的长度为 12
个字节,包含:
-
一个
4
字节时间戳,它表示ObjectId
的创建时间,并以自UNIX
纪元以来的秒数为单位进行测量。 -
每个进程会生成一次
5
字节随机值。这个随机值对于机器和进程是唯一的。 -
三字节递增计数器(初始化为随机值)。
对于时间戳和计数器值,最高有效字节在字节序列中最先出现(大端字节序)。对于其他 BSON 值,最低有效字节最先出现(小端字节序)。如果使用整数值创建对象标识符(ObjectId
),则该整数将替换时间戳。
在 MongoDB
中,存储在标准集合中的每个文档都需要一个唯一的 _id
字段作为主键。如果插入的文档省略了_id
字段,则MongoDB
驾驶员会自动为 _id
字段生成 ObjectId
。MongoDB
客户端应添加一个具有唯一 ObjectId
的 _id
字段。为 _id
字段使用 ObjectId
还能带来以下好处:
-
您可以使用
ObjectId.getTimestamp()
方法访问mongosh
中的ObjectId
创建时间。 -
ObjectID
大致按创建时间排序,但并非完全有序。在包含ObjectId
值的_id
字段上对集合排序,大致相当于按创建时间排序。但是, 仅有一秒的时间分辨率,因此在同一秒内创建的ObjectId
值不能保证顺序,并且由可能具有不同系统时钟的客户端生成。
2.17 timestamp
$type: "timestamp"
时间戳。BSON
具一种特殊的时间戳类型,供 MongoDB
内部使用,与常规的 Date
类型无关。此内部时间戳类型是 64
位值,其中:
-
最高的
32
位有效位则是time_t
值(自UNIX
纪元以来的秒数) -
对于给定秒内的操作,最低有效的
32
位是递增的ordinal
。
虽然 BSON
格式是小端字节序,因此首先存储最低有效位,但在所有平台上,mongod
实例始终先比较 time_t
值,然后再比较 ordinal
值,不受字节序的影响。在复制中,oplog
有一个 ts
字段。该字段的值反映利用 BSON
时间戳值确定的操作时间。在单个 mongod
实例中,oplog
中的时间戳值总是唯一的。
2.18 javascript
$type: "javascript"
三、类型函数
3.1 Date()
Date()
以字符串或日期对象的形式返回日期。 日期可以包含日期和时间,称为日期时间 。
语法
Date() // 以 mongosh 中的字符串形式返回当前日期
new Date() // 以日期对象的形式返回当前日期。
new Date(<integer>) // 将日期时间指定为自 UNIX 纪元(1970 年 1 月 1 日)以来的毫秒数,并返回所生成的 ISODate 实例。
new Date("<YYYY-mm-dd>") // 返回具有指定日期的 ISODate。
new Date("<YYYY-mm-ddTHH:MM:ss>") // 指定客户端本地时区中的日期时间,并返回具有指定 UTC 日期时间的 ISODate。
new Date("<YYYY-mm-ddTHH:MM:ssZ>") // 指定 UTC 日期时间,并返回具有指定 UTC 日期时间的 ISODate。
3.2 UUID()
UUID()
生成一个 BSON UUID
对象。
语法
UUID(<string>);
string
: 字符串, 可选。指定一个36
个字符的字符串来转换为UUID BSON
对象。如果未提供,MongoDB
将生成RFC 4122 v4
格式的随机UUID
。
3.3 Long()
3.4 Int32()
3.5 ObjectId()
ObjectId()
用于创建对象标识符(ObjectId
)
语法
const objectId = ObjectId(hexadecimal, integer);
-
hexadecimal
: 可选。新对象标识符的24
个字符十六进制字符串值。 -
integer
: 可选。整数值(以秒为单位)被添加到Unix
纪元 以创建新的时间戳。 -
返回值: 返回新的对象标识符。
12
字节的对象标识符由以下部分组成:-
一个
4
字节时间戳,它表示ObjectId
的创建时间,并以自UNIX
纪元以来的秒数为单位进行测量。 -
每个进程会生成一次
5
字节随机值。这个随机值对于机器和进程是唯一的。 -
三字节递增计数器(初始化为随机值)。
对于时间戳和计数器值,最高有效字节在字节序列中最先出现(大端字节序)。对于其他
BSON
值,最低有效字节最先出现(小端字节序)。如果使用整数值创建对象标识符(
ObjectId
),则该整数将替换时间戳。 -
方法: ObjectId()
具有以下方法:
-
ObjectId.toString()
: 以十六进制字符串形式返回对象标识符。 -
ObjectId.getTimestamp()
: 以日期形式返回对象的时间戳部分。
3.6 Timestamp()
语法
Timestamp( { "t": <integer>, "i": <integer> } )
-
t
: 整型, 默认为 自UNIX
纪元起的当前时间。可选。 以秒为单位的时间。 -
i
: 整型, 默认为1
, 可选。 用于在给定秒数内有多个操作时进行排序。如果不使用t
,则i
不起作用。
用法
Timestamp();
Timestamp(1627811580, 10)