BSON Types类型

On this page本页内容

BSON is a binary serialization format used to store documents and make remote procedure calls in MongoDB. 是一种二进制序列化格式,用于在MongoDB中存储文档和进行远程过程调用。The BSON specification is located at bsonspec.org.BSON规范位于bsonspec.org

Each BSON type has both integer and string identifiers as listed in the following table:每个BSON类型都有整数和字符串标识符,如下表所示:

Type类型Number数字Alias别名Notes备注
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 code with scope15"javascriptWithScope"Deprecated in MongoDB 4.4.MongoDB 4.4中已弃用。
32-bit integer16"int"
Timestamp17"timestamp"
64-bit integer18"long"
Decimal12819"decimal"New in version 3.4.在3.4版中新增。
Min key-1"minKey"
Max key127"maxKey"

To determine a field's type, see Check Types in the mongo Shell.要确定字段的类型,请参阅mongo Shell中的检查类型

If you convert BSON to JSON, see the Extended JSON reference.如果将BSON转换为JSON,请参阅扩展JSON参考

The following sections describe special considerations for particular BSON types.以下各节描述了特定BSON类型的特殊注意事项。

Binary Data二进制数据

A BSON binary binData value is a byte array. BSON二进制binData值是字节数组。A binData value has a subtype that indicates how to interpret the binary data. binData值有一个子类型,指示如何解释二进制数据。The following table shows the subtypes.下表显示了这些子类型。

Number数字Subtype亚型
0Generic binary subtype泛型二进制子类型
1Function data
2Binary (old)
3UUID (old)
4UUID
5MD5
6Encrypted BSON value加密BSON值
7

Compressed time series data压缩时间序列数据

New in version 5.2.在版本5.2中新增

128Custom data自定义数据

ObjectId

ObjectIds are small, likely unique, fast to generate, and ordered. objectid很小,可能是唯一的,生成速度很快,而且是有序的。ObjectId values are 12 bytes in length, consisting of:ObjectId值的长度为12字节,包括:

  • a 4-byte timestamp value, representing the ObjectId's creation, measured in seconds since the Unix epoch一个4字节的时间戳值,表示ObjectId的创建,自Unix时代以来以秒为单位
  • a 5-byte random value generated once per process. 每个进程生成一个5字节的随机值This random value is unique to the machine and process.这个随机值是机器和过程所独有的。
  • a 3-byte incrementing counter, initialized to a random value3字节递增计数器,初始化为随机值

While the BSON format itself is little-endian, the timestamp and counter values are big-endian, with the most significant bytes appearing first in the byte sequence.虽然BSON格式本身是小端的,但时间戳计数器值是大端的,最重要的字节出现在字节序列的第一位。

In MongoDB, each document stored in a collection requires a unique _id field that acts as a primary key. 在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id字段作为主键If an inserted document omits the _id field, the MongoDB driver automatically generates an ObjectId for the _id field.如果插入的文档省略了_id字段,MongoDB驱动程序会自动为_id字段生成ObjectId

This also applies to documents inserted through update operations with upsert: true.这也适用于通过upsert: true的更新操作插入的文档。

MongoDB clients should add an _id field with a unique ObjectId. MongoDB客户端应该添加一个带有唯一ObjectId的_id字段。Using ObjectIds for the _id field provides the following additional benefits:_id字段中使用ObjectId可提供以下额外好处:

  • in mongosh, you can access the creation time of the ObjectId, using the ObjectId.getTimestamp() method.mongosh中,可以使用ObjectId.getTimestamp()方法访问ObjectId的创建时间。
  • sorting on an _id field that stores ObjectId values is roughly equivalent to sorting by creation time.在存储ObjectId值的_id字段上排序大致相当于按创建时间排序。

    Important重要

    While ObjectId values should increase over time, they are not necessarily monotonic. 虽然ObjectId值应该随着时间的推移而增加,但它们不一定是单调的。This is because they:这是因为:

    • Only contain one second of temporal resolution, so ObjectId values created within the same second do not have a guaranteed ordering, and仅包含一秒钟的时间分辨率,因此在同一秒钟内创建的ObjectId值没有保证的顺序,并且
    • Are generated by clients, which may have differing system clocks.由客户端生成,这些客户端可能具有不同的系统时钟。
Tip提示
See also: 参阅:

String

BSON strings are UTF-8. BSON字符串是UTF-8。In general, drivers for each programming language convert from the language's string format to UTF-8 when serializing and deserializing BSON. 通常,在序列化和反序列化BSON时,每种编程语言的驱动程序都会从该语言的字符串格式转换为UTF-8。This makes it possible to store most international characters in BSON strings with ease. 这使得在BSON字符串中轻松存储大多数国际字符成为可能。[1] In addition, MongoDB $regex queries support UTF-8 in the regex string.此外,MongoDB$regex查询在regex字符串中支持UTF-8。

[1] Given strings using UTF-8 character sets, using sort() on strings will be reasonably correct. 给定使用UTF-8字符集的字符串,对字符串使用sort()将相当正确。However, because internally sort() uses the C++ strcmp api, the sort order may handle some characters incorrectly.但是,由于sort()内部使用C++strcmp api,因此排序顺序可能无法正确处理某些字符。

Timestamps

BSON has a special timestamp type for internal MongoDB use and is not associated with the regular Date type. BSON有一个特殊的时间戳类型供MongoDB内部使用,与常规Date类型无关。This internal timestamp type is a 64 bit value where:此内部时间戳类型为64位值,其中:

  • the most significant 32 bits are a time_t value (seconds since the Unix epoch)最高有效的32位是time_t值(自Unix纪元起的秒数)
  • the least significant 32 bits are an incrementing ordinal for operations within a given second.最低有效32位是给定秒内操作的递增ordinal

While the BSON format is little-endian, and therefore stores the least significant bits first, the mongod instance always compares the time_t value before the ordinal value on all platforms, regardless of endianness.虽然BSON格式是小端的,因此首先存储最低有效位,但mongod实例总是在所有平台上先比较time_t值,然后比较ordinal值,而不考虑字节序。

Within a single mongod instance, timestamp values are always unique.在单个mongod实例中,时间戳值总是唯一的。

In replication, the oplog has a ts field. 在复制中,oplog有一个ts字段。The values in this field reflect the operation time, which uses a BSON timestamp value.此字段中的值反映操作时间,使用BSON时间戳值。

Note注意

The BSON timestamp type is for internal MongoDB use. BSON时间戳类型供MongoDB内部使用。For most cases, in application development, you will want to use the BSON date type. 在大多数情况下,在应用程序开发中,您会希望使用BSON日期类型。See Date for more information.有关更多信息,请参阅Date

When inserting a document that contains top-level fields with empty timestamp values, MongoDB replaces the empty timestamp values with the current timestamp value, with the following exception. 插入包含带有空时间戳值的顶级字段的文档时,MongoDB会将空时间戳值替换为当前时间戳值,但以下情况除外。If the _id field itself contains an empty timestamp value, it will always be inserted as is and not replaced.如果_id字段本身包含空的时间戳值,它将始终按原样插入,而不是替换。

Example实例
Insert a document with an empty timestamp value:插入时间戳值为空的文档:
db.test.insertOne( { ts: new Timestamp() } );

Running db.test.find() would then return a document which resembles the following:然后,运行db.test.find()将返回一个类似以下内容的文档:

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

The server has replaced the empty timestamp value for ts with the timestamp value at time of insert.服务器已将ts的空时间戳值替换为插入时的时间戳值。

Date

BSON Date is a 64-bit integer that represents the number of milliseconds since the Unix epoch (Jan 1, 1970). BSON Date是一个64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数。This results in a representable date range of about 290 million years into the past and future.这导致了过去和未来约2.9亿年的代表性日期范围。

The official BSON specification refers to the BSON Date type as the UTC datetime.官方BSON规范将BSON日期类型称为UTC日期时间

BSON Date type is signed. BSON日期类型已签名。[2] Negative values represent dates before 1970.负值表示1970年之前的日期。

Example例子

Construct a Date using the new Date() constructor in mongosh:使用mongosh中的new Date()构造函数构造Date:

var mydate1 = new Date()
Example例子

Construct a Date using the ISODate() constructor in mongosh:mongosh中使用ISODate()构造函数构造日期:

var mydate2 = ISODate()
Example例子
Return the Date value as string:以字符串形式返回日期值:
mydate1.toString()
Example例子

Return the month portion of the Date value; months are zero-indexed, so that January is month 0:返回日期值的月份部分;月份为零索引,因此一月为0月:

mydate1.getMonth()
[2] Prior to version 2.0, Date values were incorrectly interpreted as unsigned integers, which affected sorts, range queries, and indexes on Date fields. 在2.0版之前,Date值被错误地解释为无符号整数,这会影响日期字段的排序、范围查询和索引。Because indexes are not recreated when upgrading, please re-index if you created an index on Date values with an earlier version, and dates before 1970 are relevant to your application.由于在升级时不会重新创建索引,如果您使用早期版本创建了Date值索引,并且1970年之前的日期与您的应用程序相关,请重新编制索引。
←  DocumentsComparison/Sort Order →