BSON

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

bson 规范位于 bsonspec.org

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

Type Number Alias Notes
Double 1 “double”
String 2 “string”
Object 3 “object”
Array 4 “array”
Binary data 5 “binData”
Undefined 6 “undefined” Deprecated.
ObjectId 7 “objectId”
Boolean 8 “bool”
Date 9 “date”
Null 10 “null”
Regular Expression 11 “regex”
DBPointer 12 “dbPointer” Deprecated.
JavaScript 13 “javascript”
Symbol 14 “symbol” Deprecated.
JavaScript (with scope) 15 “javascriptWithScope”
32-bit integer 16 “int”
Timestamp 17 “timestamp”
64-bit integer 18 “long”
Decimal128 19 “decimal” New in version 3.4.
Min key -1 “minKey”
Max key 127 “maxKey”

您可以将这些值与 $type 类型运算符一起使用, 以便按其 bson 类型查询文档。$type 类型聚合运算符使用列出的 bson 类型字符串之一返回运算符表达式的类型。

若要确定字段的类型, 请参阅检查蒙戈外壳中的类型。

如果将 bson 转换为 json, 请参阅扩展 json 引用。

以下各节介绍了特定 bson 类型的特殊注意事项。

objectid

对象很小, 可能是唯一的, 生成速度快, 并且是有序的。

objectid 值由12个字节组成, 其中前四个字节是反映 objectid 创建的时间戳。

特别:

一个4字节的值, 表示 unix 时代以来的秒数,

一个5字节的随机值, 和3字节计数器, 从随机值开始。

在 mongodb 中, 存储在集合中的每个文档都需要一个唯一的 _id 字段, 该字段充当主键。如果插入的文档省略了 _id 字段, mongodb 驱动程序将自动为 _id 字段生成 objectid。

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

mongodb 客户端应添加具有唯一 objectid 的 _id 字段。对 _id 字段使用 objectid 提供了以下额外好处:

在 mongo shell 中, 您可以使用 objectid.gettimestp() 方法访问 objectid 的创建时间。

对存储 objectid 值的 _id 字段进行排序大致相当于按创建时间排序。

重要

虽然 objectid 值应该随着时间的推移而增加, 但它们不一定是单调的。

这是因为他们:

仅包含一秒的时间分辨率, 因此在同一秒内创建的 objectid 值没有保证的顺序, 并且 由客户端生成, 客户端可能具有不同的系统时钟。

字符串

bson 字符串是 utf-8。通常, 在序列化和反序列化 bson 时, 每种编程语言的驱动程序都会从该语言的字符串格式转换为 utf-8。这样就可以轻松地将大多数国际字符存储在 bson 字符串中。

此外, mongodb $regex 查询支持正则表达式字符串中的 utf-8。

ps:给定使用 utf-8 字符集的字符串, 在字符串上使用排序 () 将是相当正确的。

但是, 由于内部排序 () 使用 c++ strcmp api, 排序顺序可能会错误地处理某些字符。

Timestamps

bson 具有用于内部 mongodb 的特殊时间戳类型, 并且不与常规 date 类型相关联。

时间戳值是一个64位值, 其中:

前32位是一个时间 _t 值 (自 unix 时代以来的秒数)

第二个32位是给定秒内操作的递增序号。

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

在复制中, oplog 有一个 tts 字段。此字段中的值反映操作时间, 该操作时间使用 bson 时间戳值。

注意

bson 时间戳类型适用于内部 mongodb。在大多数情况下, 在应用程序开发中, 您需要使用 bson 日期类型。有关详细信息, 请参阅日期。

如果在顶级字段中插入包含空 bson 时间戳的文档, mongodb 服务器将用当前时间戳值替换该空时间戳。

例如, 如果插入具有时间戳值的文档, 则如下操作所示:

var a = new Timestamp();

db.test.insertOne( { ts: a } );

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

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

如果 ts 是嵌入文档中的字段, 则服务器会将其保留为空的时间戳值。

在2.6 版中更改: 以前, 服务器将只替换插入文档的前两个字段 (包括 _id) 中的空时间戳值。

现在 mongodb 将替换任何顶级字段。

日期

bson date 是一个64位整数, 表示自 unix 时代 (1970年1月1日) 以来的毫秒数。

这导致过去和未来的可代表性日期范围约为2.9亿年。

官方的 bson 规范将 bson 日期类型称为 utc 日期时间。

已签名 “bson 日期类型”。[2] 负值表示1970年之前的日期。

var mydate1 = new Date()

参考资料

https://docs.mongodb.com/manual/introduction/