BSON Types

在本页面

BSON是二进制序列化格式,用于在 MongoDB 中存储文档和进行远程过程调用。 BSON 规范位于bsonspec.org

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

TypeNumberAliasNotes
Double1"double"
String2"string"
Object3"object"
Array4"array"
Binary data5"binData"
Undefined6"undefined"Deprecated.
ObjectId7"objectId"
Boolean8"bool"
Date9"date"
Null10"null"
Regular Expression11"regex"
DBPointer12"dbPointer"Deprecated.
JavaScript13"javascript"
Symbol14"symbol"Deprecated.
JavaScript(带范围)15"javascriptWithScope"
32-bit integer16"int"
Timestamp17"timestamp"
64-bit integer18"long"
Decimal12819"decimal"3.4 版的新功能。
Min key-1"minKey"
Max key127"maxKey"

您可以将这些值与$type运算符结合使用,以按其 BSON 类型查询文档。 $type聚合运算符使用列出的 BSON 类型字符串之一返回operator expression的类型。

要确定字段的类型,请参阅在 mongo Shell 中检查类型

如果您将 BSON 转换为 JSON,请参阅Extended JSON参考。

以下各节描述了特定 BSON 类型的特殊注意事项。

ObjectId

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

  • 一个 4 字节的* timestamp value *,表示 ObjectId 的创建,以自 Unix 纪元以来的秒数为单位

  • 5 字节随机值

  • 一个 3 字节的递增计数器,初始化为一个随机值

虽然 BSON 格式本身是低位字节序,但* timestamp counter *值是高位字节序,最高有效字节出现在字节序列中。

在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的_id字段,该字段充当primary key。如果插入的文档省略_id字段,则 MongoDB 驱动程序会自动为_id字段生成ObjectId

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

MongoDBClient 端应添加一个具有唯一 ObjectId 的_id字段。在_id字段中使用 ObjectIds 具有以下附加优点:

  • mongo shell 中,您可以使用ObjectId.getTimestamp()方法访问ObjectId的创建时间。

  • 在存储ObjectId个值的_id字段上进行排序大致相当于按创建时间进行排序。

Important

ObjectId值应随时间增加,但不一定是单调的。这是因为他们:

  • 仅包含一秒的时间分辨率,因此在同一秒内创建的ObjectId值没有保证的 Sequences,并且

  • 由 Client 端生成,Client 端可能具有不同的系统时钟。

See also

String

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

[1]对于使用 UTF-8 字符集的字符串,在字符串上使用sort()将是合理的。但是,由于内部sort()使用 C strcmp api,因此排序 Sequences 可能会错误地处理某些字符。

Timestamps

BSON 具有特殊的时间戳类型供内部 MongoDB 使用,并且不与常规Date类型关联。此内部时间戳记类型是 64 位值,其中:

  • 最重要的 32 位是time_t值(自 Unix 时代以来的秒数)

  • 最低有效 32 位是在给定的秒内进行操作的ordinal增量。

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

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

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

Note

BSON 时间戳记类型供内部 MongoDB 使用。在大多数情况下,在应用程序开发中,您将需要使用 BSON 日期类型。有关更多信息,请参见Date

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

Example

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

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

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

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

服务器已使用插入时的时间戳值替换了ts的空时间戳值。

Date

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

官方 BSON 规范将 BSON 日期类型称为* UTC datetime *。

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

Example

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

var mydate1 = new Date()

Example

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

var mydate2 = ISODate()

Example

以字符串形式返回Date值:

mydate1.toString()

Example

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

mydate1.getMonth()
[2]在 2.0 版之前,Date值被错误地解释为* unsigned *整数,这会影响Date字段上的排序,范围查询和索引。由于升级时不会重新创建索引,因此,如果您使用较早的版本在Date值上创建了索引,并且与 1970 年之前的日期相关,请重新索引。