mongodb_介绍(5)_BSON TYPE
BSON类型
BSON是用于在MongoDB中存储文档和进行远程过程调用的二进制序列化格式
BSON支持以下数据类型作为文档中的值。每个数据类型都有一个相应的数字和字符串别名,可以与$ type运算符一起使用BSON类型查询文档。
| 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 (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使用以下比较顺序,从最低到最高
- MinKey (internal type)
- Null
- Numbers (ints, longs, doubles)
- Symbol, String
- Object
- Array
- BinData
- ObjectId
- Boolean
- Date
- Timestamp
- Regular Expression
- MaxKey (internal type)
MongoDB将某些类型视为等效的,用于比较。例如,数字类型在比较之前进行转换
MongoDB将会把不存在的字段当做一个空的BSON对象。这样的话,对文档 { } 和 { a: null } 在 a 字段上进行排序,在排序顺序上将会看做相等。
在数组中,小于比较或者升序排列会比较数组中最小的元素,大于比较或者降序排列会比较数组中最大的元素。因此,在比较一个字段值为单元素数组(例如, [ 1 ] )与一个非数组字段(例如, 2 )时,比较的是 1 和 2 。一个空数组(例如, [ ])的比较会将空数组处理为小于 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()
浙公网安备 33010602011771号