BSON是一种二进制序列化格式,用于在MongoDB中存储文档和进行远程过程调用。BSON规范位于 bsonspec.org。
每种BSON类型都具有整数和字符串标识符,如下表所示:
类型 | 数 | 别名 | 笔记 |
---|---|---|---|
双 | 1个 | “双” | |
串 | 2 | “串” | |
宾语 | 3 | “宾语” | |
数组 | 4 | “数组” | |
二进制数据 | 5 | “ binData” | |
未定义 | 6 | “未定义” | 不推荐使用。 |
对象编号 | 7 | “ objectId” | |
布尔型 | 8 | “布尔” | |
日期 | 9 | “日期” | |
空值 | 10 | “空值” | |
正则表达式 | 11 | “正则表达式” | |
DBPointer | 12 | “ dbPointer” | 不推荐使用。 |
的JavaScript | 13 | “ javascript” | |
符号 | 14 | “符号” | 不推荐使用。 |
JavaScript(带作用域) | 15 | “ javascriptWithScope” | |
32位整数 | 16 | “ int” | |
时间戳记 | 17 | “时间戳” | |
64位整数 | 18岁 | “长” | |
小数128 | 19 | “十进制” | 3.4版的新功能。 |
最小键 | -1 | “ minKey” | |
最大键 | 127 | “ maxKey” |
您可以将这些值与$type
运算符一起使用,以按其BSON类型查询文档。所述$type
聚合操作者返回的类型操作者表达使用列出的BSON类型字符串之一。
要确定字段的类型,请参阅mongo Shell中的Check Types。
如果将BSON转换为JSON,请参阅扩展JSON参考。
以下各节描述了特定BSON类型的特殊注意事项。
ObjectId很小,很可能是唯一的,可以快速生成并排序。ObjectId值的长度为12个字节,包括:
虽然BSON格式本身是低位字节序,但时间戳和 计数器值却是高位字节序,最高有效字节出现在字节序列中。
在MongoDB中,存储在集合中的每个文档都需要一个唯一的
_id字段作为主键。如果插入的文档忽略该_id
字段,则MongoDB驱动程序会自动为该字段生成一个ObjectId_id
。
这也适用于通过upsert:true通过更新操作插入的文档。
MongoDB客户端应添加一个_id
具有唯一ObjectId 的字段。在该_id
字段中使用ObjectIds 还可以带来以下好处:
在mongo
shell中,您可以ObjectId
使用ObjectId.getTimestamp()
方法访问的创建时间。
在_id
存储ObjectId
值的字段上进行排序大致相当于按创建时间进行排序。
也可以看看
BSON字符串为UTF-8。通常,在对BSON进行序列化和反序列化时,每种编程语言的驱动程序都会从该语言的字符串格式转换为UTF-8。这样就可以轻松地将大多数国际字符存储在BSON字符串中。
[1]此外,MongoDB
$regex
查询在正则表达式字符串中支持UTF-8。
[1] | 给定使用UTF-8字符集的sort() 字符串,在字符串上使用将是相当正确的。但是,由于内部
sort() 使用C ++ strcmp API,因此排序顺序可能会错误地处理某些字符。 |
BSON有一个特殊的时间戳类型内部 MongoDB的使用, 不与常规相关的日期 类型。此内部时间戳记类型是64位值,其中:
time_t
值(自Unix时代以来的秒数)ordinal
给定秒内的操作增量。尽管BSON格式是低位优先的,因此首先存储了最低有效位,但是无论字节序如何,该mongod
实例始终在所有平台上time_t
先比较该值ordinal
。
在单个mongod
实例中,时间戳记值始终是唯一的。
在复制中,操作日志具有一个ts
字段。该字段中的值反映了使用BSON时间戳值的操作时间。
注意
BSON时间戳类型供内部 MongoDB使用。在大多数情况下,在应用程序开发中,您将需要使用BSON日期类型。有关更多信息,请参见日期。
插入包含带有空时间戳值的顶级字段的文档时,MongoDB会将空时间戳值替换为当前时间戳值,但以下情况除外。如果_id
字段本身包含空的时间戳记值,则将始终按原样插入而不替换它。
BSON Date是一个64位整数,代表自Unix时代(1970年1月1日)以来的毫秒数。这导致过去和将来的可表示日期范围约为2.9亿年。
该官员BSON规格 指的是BSON Date类型为UTC日期时间。
BSON日期类型已签名。[2]负值表示1970年之前的日期。
例
在外壳中使用构造函数
构造一个Date :new Date()
mongo
例
ISODate()
在mongo
外壳中使用构造函数
构造一个Date :
例
Date
以字符串形式返回值:
例
返回日期值的月份部分;月是零索引,因此一月是月0
:
[2] | 在2.0版之前,Date 值被错误地解释为无符号整数,这会影响排序,范围查询和Date 字段索引。由于升级时不会重新创建索引,因此,如果您Date 使用较早版本的值创建了索引,则请重新索引,并且1970年之前的日期与您的应用程序相关。 |