[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具有以下额外优点:
-
在
mongoshell中,您可以通过ObjectId使用ObjectId.getTimestamp()方法访问的创建时间。 -
在
_id存储ObjectId值的字段上进行排序大致相当于按创建时间进行排序。
扩展
字符串
BSON字符串为UTF-8。通常,在对BSON进行序列化和反序列化时,每种编程语言的驱动程序都会从该语言的字符串格式转换为UTF-8。这样就可以轻松地将大多数国际字符存储在BSON字符串中。 [1]此外,MongoDB $regex查询在正则表达式字符串中支持UTF-8。
| [1] | 给定使用UTF-8字符集的sort()字符串,在字符串上使用将是正确的。但是,由于内部 sort()使用C ++ strcmpAPI,因此排序顺序可能会错误地处理某些字符。 |
时间戳
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)