- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
BSON类型
BSON类型
在本页面
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” | 不推荐使用。 |
对象编号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 (带范围) | 15 | “javascriptWithScope” | |
32位整数 32-bit integer | 16 | “int” | |
时间戳 Timestamp | 17 | “timestamp” | |
64位整数 64-bit integer | 18 | “long” | |
小数128 Decimal128 | 19 | “decimal” | 3.4版的新功能。 |
最小键 Min key | -1 | “minKey” | |
最大键 Max key | 127 | “maxKey” |
您可以将这些值与$type
运算符一起使用,以按其BSON类型查询文档。所述$type
聚合操作者返回的类型操作者表达使用列出的BSON类型字符串之一。
要确定字段的类型,请参阅mongo Shell中的Check Types。
如果将BSON转换为JSON,请参阅扩展JSON参考。
以下各节描述了特定BSON类型的特殊注意事项。
ObjectId
ObjectId很小,可能唯一,可以快速生成并排序。ObjectId值的长度为12个字节,包括:
- 一个4字节的时间戳记值,代表自Unix时代以来以秒为单位的ObjectId的创建
- 5字节随机值
- 3字节递增计数器,初始化为随机值
虽然BSON格式本身是低位优先的,但时间戳和 计数器值却是高位优先的,最高有效字节在字节序列中排在最前面。
在MongoDB中,存储在集合中的每个文档都需要一个唯一的 _id字段作为主键。如果插入的文档省略了该_id
字段,则MongoDB驱动程序会自动为该字段生成一个ObjectId_id
。
这也适用于通过upsert:true通过更新操作插入的文档。
MongoDB客户端应添加一个_id
具有唯一ObjectId 的字段。在该_id
字段中使用ObjectIds 还可以带来以下好处:
在
mongo
shell中,您可以使用ObjectId.getTimestamp()
方法访问ObjectId
的创建时间。在存储
ObjectId
值的_id
字段上按大致相当于创建时间进行排序。
重要
尽管ObjectId值应随时间增加,但不一定是单调的。这是因为他们:
- 仅包含一秒的时间分辨率,因此 在同一秒内创建的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
值与ordinal
值比较。
在单个mongod
实例中,时间戳记值始终是唯一的。
在复制中,操作日志具有一个ts
字段。该字段中的值反映了使用BSON时间戳值的操作时间。
注意
BSON时间戳类型供MongoDB内部 使用。在大多数情况下,在应用程序开发中,您将需要使用BSON日期类型。有关更多信息,请参见日期。
当插入包含带有空时间戳值的顶级字段的文档时,MongoDB会将空时间戳值替换为当前时间戳值,但以下情况除外。如果_id
字段本身包含空的时间戳记值,则将始终按原样插入而不替换它。
示例
插入带有空时间戳值的文档:
复制
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日)以来的毫秒数。这导致可以追溯到过去和未来约2.9亿年的日期范围。
该官方BSON规范 指的是BSON Date类型为UTC日期时间。
BSON日期类型是有符号整数。[2]负值表示1970年之前的日期。
示例
在 mongo
shell中使用构造函数 new Date()
构造一个Date :
复制
var mydate1 = new Date()
示例
在 mongo
shell中使用构造函数ISODate()
构造一个Date :
复制
var mydate2 = ISODate()
示例
以字符串形式返回Date
值:
复制
mydate1.toString()
示例
返回日期值的月份部分;月是零索引,因此一月是0
月:
复制
mydate1.getMonth()
[2] | 在2.0版之前,Date 值被错误地解释为无符号整数,这会影响排序,范围查询和Date 字段索引。由于升级时不会重新创建索引,因此,如果您早期版本使用Date 值创建了索引,请对与应用相关的、1970年前的日期进行重新索引。 |
---|---|
原文链接:https://docs.mongodb.com/v4.2/reference/bson-types/
译者:小芒果
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05