MongoDB文档翻译-引言-BSON类型
来源:互联网 发布:小海家淘宝 编辑:程序博客网 时间:2024/05/16 11:47
说明:英文原文地址:https://docs.mongodb.com/v3.2/reference/bson-types/。
本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。
BSON类型
BSON是一种二进制序列化格式,用来在MongoDB中存储文档和执行远程过程调用。BSON规范在bsonspec可以看到。
BSON支持以下数据类型作为文档中字段的值。每种数据类型有个相应的数字编号和字符串别名,可以在$type
操作符和查询文档中使用。
要确定字段的类型,参见在mongo
shell中检查类型。
如果要把BSON转换成JSON,查看扩展JSON。
比较/排序顺序
当比较不同BSON类型的值时,MongoDB使用如下比较顺序,从低到高:
- MinKey(内部类型)
- Null
- Number(整形、长整形、双精度)
- Symbol,String
- Object
- Array
- BinData
- ObjectId
- Boolean
- Date
- Timestamp
- Regular Expression
- MaxKey(内部类型)
为比较,MongoDB把一些类型看作是等同的。例如,数字类型比较前会被转换。
3.0.0版本的改动:Date对象排在Timestamp对象前。之前Date和Timestamp对象是一起排序的。
比较时,不存在的字段会被当成一个空BSON对象。这样的话,在文档{}
和{a:null}
中对于a
字段的排序过程中,会把这两个文档当成是一样的。
对于数组,小于比较或者升序排序会比较数组最小的元素,大于比较或降序排序会比较数组的最大元素。当单个元素的数组与非数组字段比较时,如[1]与2,比较是在1和2之间进行的。空数组([])的比较会把数组当成小于null或字段缺失。
MongoDB按以下顺序对BinData
进行排序:
- 首先,按数据的长度或大小。
- 其次,按BSON的一个字节的子类型。
- 最后,按数据,一个字节一个字节比较。
以下部分描述了几个特殊BSON类型需要特别考虑的地方。
ObjectId
ObjectId类型很小,几乎是唯一的,能快速生成和排序。ObjectId值由12个字节组成,前4个字节是反应ObjectId创建的时间戳,特别地:
- 4字节的值表示从Unix纪元开始的秒数
- 3个字节的机器标识符
- 2个字节的进程id
- 3个字节的计数器,以一个随机值开始
MongoDB中,每个保存在集合中的文档都需要一个唯一的_id字段作为主键。如果插入的文档没有_id字段,MongoDB驱动自动为_id字段生成一个ObjectId
。
通过带upsert:true
选项的更新操作所插入的文档也会自动生成_id字段。
MongoDB客户端应该用唯一的ObjectId添加_id字段。把ObjectId作为_id字段有如下额外的好处:
在
mongo
shell中,使用ObjectId.getTimestamp()
方法可以获取到ObjectId的创建时间对一个存储
ObjectId
值的_id字段排序几乎等价于对创建时间排序重要:
在1秒的时间内,
ObjectId
值与生成时间的没有严格的顺序,如果多个系统,或者一个系统的多个进程/线程在1秒内生成ObjectId
的话。ObjectId
不代表严格的插入顺序。由于客户端驱动生成ObjectId
值,客户端之间的时钟偏离也会导致非严格的顺序。
String(字符串)
BSON字符串是UTF-8类型的。一般地,序列化和反序列化时,各种编程语言的驱动会把该语言的字符串转换成UTF-8格式。这使得BSON字符串可以轻松地存储大部分国际化字符。此外,MongoDB$regex
查询在正则字符串中支持UTF-8。
### Timestamp(时间戳)
BSON有一个特殊的时间戳类型,供MongoDB内部使用,与常规的Date类型没有关系。Timestamp值是64位:
- 前32位是
time_t
值(从Unix纪元开始的秒数) 第二个32位是一个递增的有序数,是在给定秒内的操作数
在单个
mongod
实例中,Timestamp类型总是唯一的。在复制中,
oplog
有一个ts
字段。这个字段的值反应了操作时间,使用的就是BSON Timestamp类型的值。注意:
BSON Timestamp类型只是给MongoDB内部使用的。对大多数情形,在应用开发中,你可能使用BSON Date类型。
如果插入一个最顶层字段是一个空的BSON Timestamp的文档,MongoDB服务器会用当前时间戳的值替换该空的时间戳。例如:
var a = new Timestamp();db.test.insert( { ts: a } );
然后,
db.test.find()
操作将返回如下所示的文档:{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }
如果
ts
是嵌入文档的一个字段,服务器不会去处理它。
Date(日期)
BSON Date是一个64位的整数,代表自Unix纪元经过的微秒数(1970年1月1日)。这可以表示29亿年。
官方BSON规范把BSON Date类型当成UTC时间。
BSON Date是有符号的。负值表示1970年以前的日期。
例子:
在
mongo
shell中用`new Date()·创建一个Datevar mydate1 = new Date()
例子:
在
mongo
shell中用ISODate()
创建一个Datevar mydate2 = ISODate()
例子:
以字符串返回Date值
mydate1.toString()
例子:
返回Date值的月份。月份是从0开始的,所以0对应的是1月。
mydate1.getMonth()
- MongoDB文档翻译-引言-BSON类型
- MongoDB文档翻译-引言-文档
- MongoDB文档翻译-引言-MongoDB介绍
- MongoDB文档翻译-引言-数据库和集合
- Mongodb 文档翻译
- MongoDB文档翻译-聚集
- BSON和MongoDB
- Mongodb 数据结构-BSON
- BSON及mongoDB数据类型
- MongoDB与BSON
- mongodb中的bson
- mongodb导入bson数据
- Python-MongoDB官方文档翻译
- MongoDB文档翻译-mongo Shell
- MongoDB文档翻译-CRUD操作
- MongoDB文档翻译-文本搜索
- MongoDB文档翻译-聚集管道
- MongoDB文档翻译-Map-Reduce
- SSM框架 之 Spring-AOP(面向切面编程)
- PAT 乙级 1003. 我要通过!(20) Java版
- C++类的继承中构造函数和析构函数调用顺序例子
- 【安装eclipse, 配置java环境教程】 编写第一个java程序
- SDWebImage的一些细节
- MongoDB文档翻译-引言-BSON类型
- AndroidManifest.xml中一些常用的属性
- ansible +centos7 批量安装zabbix agent
- centos 7 密码忘记 如何进入修改
- PAT 乙级 1005. 继续(3n+1)猜想 (25) Java版
- 【matlab】全面总结:MATLAB如何画出漂亮的图
- Ubuntu 下 Android studio Can't use Subversion command line client:svn
- iOS更换头像和名片背景
- Android Studio的一些常用配置