[mongo] 1.4 mongodb BSON 和 JSON 数据类型
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 code with scope | 15 | “javascriptWithScope” | Deprecated in MongoDB 4.4. |
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
还支持数字别名,该别名与 integer, decimal, double, and long 类型匹配。$type
集合运算符返回其参数的BSON类型。- 如果参数是BSON integer, decimal, double, and long 类型,
$isNumber
聚合运算符返回true
。4.4版新功能
要确定字段的类型,请参阅Check Types in the mongo Shell.。
如果将BSON转换为JSON,请参阅扩展JSON参考。
以下各节描述了特定BSON类型的特殊注意事项。
ObjectId
ObjectId很小,很可能是唯一的,可以快速生成并排序。ObjectId值的长度为12字节,由以下组成:
- 一个4字节的时间戳记值,代表自Unix时代以来以秒为单位的ObjectId的创建
- 5字节随机值
- 3字节递增计数器,初始化为随机值
虽然BSON格式本身是小字节序,但时间戳和 计数器值却是大字节序,最重要字节出现在字节序列首位。
在MongoDB中,存储在集合中的每个文档都有一个唯一的 _id字段作为主键。如果插入的文档省略了该_id
字段,则MongoDB驱动程序会自动为_id
字段生成一个ObjectId。
也可通过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位,其中:
- 最高的32位是一个
time_t
值(自Unix时代以来的秒数) - 最低的32位是
ordinal
给定秒内操作的增量。
尽管BSON格式是小字节序的,首先存储了最低位,但是无论字节序如何,mongod
实例始终在所有平台上先比较time_t
的序数
。
在mongod
单实例中,时间戳记值始终是唯一的。
在复制中,操作日志具有一个ts
字段。该字段中的值反映了使用BSON时间戳值的操作时间。
注意
BSON时间戳类型供 MongoDB 内部使用。在大多数情况下,在程序开发中,需要使用BSON日期类型。有关更多信息,请参见日期。
当插入包含带有空时间戳值的顶级字段的文档时,MongoDB会将空时间戳值替换为当前时间戳值,但如果_id
字段本身包含空的时间戳记值,则将始终按原样插入而不替换它。
例
插入带有空时间戳值的文档:
db.test.find()
然后,运行将返回类似于以下内容的文档:
{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
服务使用插入时的时间戳值替换了ts字段空的时间戳值。
日期
BSON Date是一个64位整数,代表自Unix纪元(1970年1月1日)以来的毫秒数。这导致可以追溯到过去和未来约2.9亿年的日期范围。
官方BSON规格 指的是BSON Date类型为UTC日期时间。
BSON日期类型已标记的。[2]负值表示1970年之前的日期。
EXAMPLE
Construct a Date using the new Date()
constructor in the mongo
shell:
var mydate1 = new Date()
Construct a Date using the ISODate()
constructor in the mongo
shell:
- 点赞
- 收藏
- 关注作者
评论(0)