MongoDB文档翻译-引言-BSON类型

来源:互联网 发布:小海家淘宝 编辑:程序博客网 时间:2024/05/16 11:47

说明:英文原文地址:https://docs.mongodb.com/v3.2/reference/bson-types/。
本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。

BSON类型

BSON是一种二进制序列化格式,用来在MongoDB中存储文档和执行远程过程调用。BSON规范在bsonspec可以看到。

BSON支持以下数据类型作为文档中字段的值。每种数据类型有个相应的数字编号和字符串别名,可以在$type操作符和查询文档中使用。

类型 编号 别名 说明 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 (with scope) 15 “javascriptWithScope” 32-bit integer 16 “int” Timestamp 17 “timestamp” 64-bit integer 18 “long” Min key -1 “minKey” Max key 127 “maxKey”

要确定字段的类型,参见mongoshell中检查类型

如果要把BSON转换成JSON,查看扩展JSON

比较/排序顺序

当比较不同BSON类型的值时,MongoDB使用如下比较顺序,从低到高:

  1. MinKey(内部类型)
  2. Null
  3. Number(整形、长整形、双精度)
  4. Symbol,String
  5. Object
  6. Array
  7. BinData
  8. ObjectId
  9. Boolean
  10. Date
  11. Timestamp
  12. Regular Expression
  13. MaxKey(内部类型)

为比较,MongoDB把一些类型看作是等同的。例如,数字类型比较前会被转换。

3.0.0版本的改动:Date对象排在Timestamp对象前。之前Date和Timestamp对象是一起排序的。

比较时,不存在的字段会被当成一个空BSON对象。这样的话,在文档{}{a:null}中对于a字段的排序过程中,会把这两个文档当成是一样的。

对于数组,小于比较或者升序排序会比较数组最小的元素,大于比较或降序排序会比较数组的最大元素。当单个元素的数组与非数组字段比较时,如[1]与2,比较是在1和2之间进行的。空数组([])的比较会把数组当成小于null或字段缺失。

MongoDB按以下顺序对BinData进行排序:

  1. 首先,按数据的长度或大小。
  2. 其次,按BSON的一个字节的子类型。
  3. 最后,按数据,一个字节一个字节比较。

以下部分描述了几个特殊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字段有如下额外的好处:

  • mongoshell中,使用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年以前的日期。

    例子:

    mongoshell中用`new Date()·创建一个Date

    var mydate1 = new Date()

    例子:

    mongoshell中用ISODate()创建一个Date

    var mydate2 = ISODate()

    例子:

    以字符串返回Date值

    mydate1.toString()

    例子:

    返回Date值的月份。月份是从0开始的,所以0对应的是1月。

    mydate1.getMonth()
0 0
原创粉丝点击