mongodb_介绍(5)_BSON TYPE

BSON类型

BSON是用于在MongoDB中存储文档和进行远程过程调用的二进制序列化格式

BSON支持以下数据类型作为文档中的值。每个数据类型都有一个相应的数字和字符串别名,可以与$ type运算符一起使用BSON类型查询文档。

 NumberAliasNotes
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 (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”  

比较/排序顺序

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

  1. MinKey (internal type)
  2. Null
  3. Numbers (ints, longs, doubles)
  4. Symbol, String
  5. Object
  6. Array
  7. BinData
  8. ObjectId
  9. Boolean
  10. Date
  11. Timestamp
  12. Regular Expression
  13. MaxKey (internal type)

MongoDB将某些类型视为等效的,用于比较。例如,数字类型在比较之前进行转换

MongoDB将会把不存在的字段当做一个空的BSON对象。这样的话,对文档 { }{ a: null }a 字段上进行排序,在排序顺序上将会看做相等。

在数组中,小于比较或者升序排列会比较数组中最小的元素,大于比较或者降序排列会比较数组中最大的元素。因此,在比较一个字段值为单元素数组(例如, [ 1 ] )与一个非数组字段(例如, 2 )时,比较的是 12 。一个空数组(例如, [ ])的比较会将空数组处理为小于 null 或缺失字段。

MongoDB按照以下顺序排序BinData

  • 首先,数据的长度或大小。
  • 然后,通过BSON一个字节的子类型。
  • 最后,通过数据,执行一个逐字节的比较。

以下部分介绍特定BSON类型的特殊注意事项:

ObjectId

ObjectIds很小,可能是唯一的,快速生成和顺序的。 ObjectId值由12个字节组成,其中前四个字节是反映ObjectId创建的时间戳

  • 表示自Unix纪元以来的秒数的4字节值
  • 3字节机器标识符
  • 2字节进程标识
  • 3字节计数器,以随机值开始

在MongoDB中,存储在集合中的每个文档都需要一个用作主键的唯一的_id字段。如果插入的文档省略_id字段,MongoDB驱动程序将自动为_id字段生成一个ObjectId。

MongoDB客户端应添加具有唯一ObjectId的_id字段。为_id字段使用ObjectIds提供了以下附加优点:

  • 在mongo shell中,您可以使用ObjectId.getTimestamp()方法访问ObjectId的创建时间。
  • 存储ObjectId值的_id字段上的排序大致相当于按创建时间排序。

IMPORTANT

ObjectId值与生成时间的顺序之间的关系在一秒钟内就不严格。如果单个系统上的多个系统或多个进程或线程会在一秒钟内生成值; ObjectId值不表示严格的插入顺序。客户端之间的时钟偏移也可能导致非严格的排序,即使是值,因为客户端驱动程序生成ObjectId值。

 

字符串

BSON字符串都是UTF-8编码。一般说来,每种编程语言的驱动程序在序列化和反序列化BSON的时候,都会从语言的字符串形式转化为UTF-8。这就使得使用BSON字符串简单存储大多数国际字符变为可能。 此外,MongoDB $regex 查询支持正则字符串中使用UTF-8。

对于使用UTF-8字符集的字符串,在字符串上使用 sort() 理论上来说都是正确的。然而,由于内部的 sort() 方法使用的是 C++的 strcmp api,排序时可能出错误处理某些字符串。

 

时间戳

BSON有一个特殊的时间戳类型用于 MongoDB 内部 使用,与普通的 日期 类型不相关。 时间戳值是一个64位的值。其中:

  • 前32位是一个 time_t 值(与Unix新纪元相差的秒数)
  • 后32位是在某秒中操作的一个递增的``序数``。

在单个 mongod 实例中,时间戳值通常是唯一的。

在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。

NOTE
BSON时间戳类型主要用于 MongoDB*内部* 使用 。在大多数情况下的应用开发中,你可以使用BSON日期类型。查阅 日期 了解更多信息。

如果你插入一个在一级字段中包含空BSON时间戳的文档,MongoDB服务器将会使用当前的时间戳值替换空的时间戳。例如,如果你使用下面的操作插入一个包含时间戳值的文档:

var a = new Timestamp();

db.test.insert( { ts: a } );

然后, db.test.find() 操作将会返回一个类似于下面的文档

{ "_id" : ObjectId("542c2b97bac0595474108b48"), "ts" : Timestamp(1412180887, 1) }

日期

BSON日期是一个64位整数,表示当前距离Unix新纪元(1970年1月1日)的毫秒数。这样就保证了过去和未来2.9亿年的可表示日期范围。
正式的BSON说明 <http://bsonspec.org/#/specification>`_ 将BSON日期类型成为 UTC 时间。
BSON日期类型是有符号的。 [2] 负数表示1970年之前的日期。

示例1:

var mydate1 = new Date()

示例2:

var mydate2 = ISODate()

示例3:

以字符串形式返回日期

mydate1.toString()

示例4:

返回Date值的月份部分;月份零索引,所以1月份是0

mydate1.getMonth()

 

posted on 2017-04-13 17:49  onelaker  阅读(1546)  评论(0)    收藏  举报

导航