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类型都有整数和字符串标识符,如下表所示:
Double | 1 | "double" | |
String | 2 | "string" | |
Object | 3 | "object" | |
Array | 4 | "array" | |
Binary data | 5 | "binData" | |
Undefined | 6 | "undefined" | |
ObjectId | 7 | "objectId" | |
Boolean | 8 | "bool" | |
Date | 9 | "date" | |
Null | 10 | "null" | |
Regular Expression | 11 | "regex" | |
DBPointer | 12 | "dbPointer" | |
JavaScript | 13 | "javascript" | |
Symbol | 14 | "symbol" | |
JavaScript code with scope | 15 | "javascriptWithScope" | |
32-bit integer | 16 | "int" | |
Timestamp | 17 | "timestamp" | |
64-bit integer | 18 | "long" | |
Decimal128 | 19 | "decimal" | |
Min key | -1 | "minKey" | |
Max key | 127 | "maxKey" |
$type
operator supports using these values to query fields by their BSON type. $type
运算符支持使用这些值按字段的BSON类型查询字段。$type
number
alias, which matches the integer, decimal, double, and long BSON types.number
别名,它匹配整数、十进制、双精度和长BSON类型。$type
aggregation operator returns the BSON type of its argument.$type
聚合运算符返回其参数的BSON类型。$isNumber
aggregation operator returns true
if its argument is a BSON integer, decimal, double, or long. New in version 4.4$isNumber
聚合运算符的参数是BSON整数、十进制、双精度或长型,则返回true
。版本4.4中新增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类型的特殊注意事项。
A BSON binary BSON二进制binData
value is a byte array. binData
值是字节数组。A binData
value has a subtype that indicates how to interpret the binary data. binData
值有一个子类型,指示如何解释二进制数据。The following table shows the subtypes.下表显示了这些子类型。
0 | |
1 | Function data |
2 | Binary (old) |
3 | UUID (old) |
4 | UUID |
5 | MD5 |
6 | |
7 |
|
128 |
ObjectIds are small, likely unique, fast to generate, and ordered. objectid很小,可能是唯一的,生成速度很快,而且是有序的。ObjectId values are 12 bytes in length, consisting of:ObjectId值的长度为12字节,包括:
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 MongoDB客户端应该添加一个带有唯一ObjectId的_id
field with a unique ObjectId. _id
字段。Using ObjectIds for the 在_id
field provides the following additional benefits:_id
字段中使用ObjectId可提供以下额外好处:
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
字段上排序大致相当于按创建时间排序。
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 此外,MongoDB$regex
queries support UTF-8 in the regex string.$regex
查询在regex字符串中支持UTF-8。
[1] | sort() on strings will be reasonably correct. sort() 将相当正确。sort() uses the C++ strcmp api, the sort order may handle some characters incorrectly.sort() 内部使用C++strcmp api,因此排序顺序可能无法正确处理某些字符。 |
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位值,其中:
time_t
value (seconds since the Unix epoch)time_t
值(自Unix纪元起的秒数)ordinal
for operations within a given second.ordinal
。While the BSON format is little-endian, and therefore stores the least significant bits first, the 虽然BSON格式是小端的,因此首先存储最低有效位,但mongod
instance always compares the time_t
value before the ordinal
value on all platforms, regardless of endianness.mongod
实例总是在所有平台上先比较time_t
值,然后比较ordinal
值,而不考虑字节序。
Within a single 在单个mongod
instance, timestamp values are always unique.mongod
实例中,时间戳值总是唯一的。
In replication, the oplog has a 在复制中,oplog有一个ts
field. ts
字段。The values in this field reflect the operation time, which uses a BSON timestamp value.此字段中的值反映操作时间,使用BSON时间戳值。
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
字段本身包含空的时间戳值,它将始终按原样插入,而不是替换。
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
的空时间戳值替换为插入时的时间戳值。
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年之前的日期。
Construct a Date using the 使用new Date()
constructor in mongosh
:mongosh
中的new Date()
构造函数构造Date:
var mydate1 = new Date()
Construct a Date using the 在ISODate()
constructor in mongosh
:mongosh
中使用ISODate()
构造函数构造日期:
var mydate2 = ISODate()
mydate1.toString()
Return the month portion of the Date value; months are zero-indexed, so that January is month 返回日期值的月份部分;月份为零索引,因此一月为0
:0
月:
mydate1.getMonth()
[2] | Date values were incorrectly interpreted as unsigned integers, which affected sorts, range queries, and indexes on Date fields. Date 值被错误地解释为无符号整数,这会影响日期字段的排序、范围查询和索引。Date values with an earlier version, and dates before 1970 are relevant to your application.Date 值索引,并且1970年之前的日期与您的应用程序相关,请重新编制索引。 |