快捷搜索:  汽车  科技

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)6.Array5.Object2.Null3.Numbers (ints longs doubles)4.Symbol String

BSON类型

BSON是一种用来存储文档和MongoDB执行远程调用的二进制序列化格式。BSON规范位于bsonspec.org。

BSON支持以下数据类型,每种数据类型都有一个相应的数字和字符串别名,可以使用别名和$type操作符基于类型匹配模式检索文档。

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(1)

比较/排序顺序

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

1.MinKey (内部类型)

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 (内部类型)

对于比较而言,MongoDB将一些类型看作是等价的。例如,数值类型在比较之前执行转换。

3.0.0版本的变化:Date排在Timestamp 之前。之前的版本,Date和Timestamp 排序相同。

对于比较而言,MongoDB将不存在的字段看作空BSON 对象,例如,对{ } 和{ a: null }在排序中被看作是等价的。

对于数组而言,小于比较或者升序排序比较的是数组中最小的元素,大于比较或者降序排序比较的是数组中最大的元素。例如,比较一个只有一个元素的数组类型字段(例如 [ 1 ]))和非数组字段(例如2),比较的是1和2。

空数组(例如[])的比较被看作是小于空(null)或被看作丢失的字段。

对于BinData 类型,按下面顺序排序:

1.首先,按数据的长度或大小排序。

2.然后,按BSON一个字节子类型排序。

3.最后,一个字节一个字节地比较。

下面的章节针对特定的BSON类型描述了特别的注意事项:

ObjectId

ObjectId占据存储空间小、唯一、可被快速生成和索引。ObjectId类型值为12字节,前四个字节是一个时间戳,表示其被创建的时间:

  • 前四个字节表示从UNIX新纪元来的秒数。
  • 接下来的三个字节表示机器编号。
  • 接下来的两个字节表示进程ID。
  • 最后三个字节表示以随机数开始的计数。

在MongoDB中,集合中的文档需要一个作为主键的唯一_id字段,如果没有指定_id字段,MongoDB默认将ObjectId类型值作为_id字段值。例如,待插入文档不包含顶级_id字段,MongoDB驱动就会添加一个ObjectId类型的_id字段。

另外,如果mongod接收的待插入文档不包含_id字段,mongod将会添加一个ObjectId类型的_id字段。

MongoDB 客户端应该添加一个值为ObjectId的_id字段,使用值为ObjectId的_id字段有如下好处:

  • 在mongo shell中,你可以使用ObjectId.getTimestamp() 方法获得ObjectId创建的时间。
  • 给值为ObjectId的_id字段排序大体等价于按时间排序。

重要的:

在一秒之内,ObjectId值的顺序与生成时间之间的关系并不是严格的。如果单系统中,多个系统或多个进程或多个线程在一秒内产生了多个ObjectId值,这些值并不会严格地按照插入顺序展示。多客户端之间的时钟偏移也会导致不严格排序,即使这些值由客户端驱动程序生成。

String

BSON 的String类型是UTF-8编码的。一般来说,每种语言对应的驱动程序在执行序列化和反序列化BSON时将语言自身的string类型转换为UTF-8编码,这使得BSON string可以接受大多数国际字符。另外,使用$regex 查询支持UTF-8编码的正则表达式字符。

Timestamp

BSON 中有一个特殊的时间戳类型供MongoDB内部使用,并且不能和Date 配合使用。时间戳类型是64位的值:

  • 第一个32位是time_t的值(从UNIX新纪元来的秒数)。
  • 第二个32位是给定时间里一些操作的递增序号。

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

在复制功能中,oplog有一个ts字段,字段值使用DSON时间戳,它反映了操作时间。

注:

BSON时间戳类型(Timestape)是供MongoDB内部使用的。大多数情况下,开发应用程序时使用Date类型。

如果你所插入文档的顶级字段是一个空值的时间戳类型(Timestape),MongoDB 服务器将会用当前的时间戳(Timestape)替换它。例如执行下面的操作:

var a = new Timestamp();

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

然后,使用db.test.find()方法查询,返回结果为:

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

如果ts是嵌入式文档的一个字段,服务器会保持其为空值。

2.6版本中的变化:以前当插入文档时,服务器仅仅会替换头两个空值时间戳类型(Timestape)字段,包括_id字段。现在服务器会替换任何的顶级字段。

Date

BSON 日期类型是64位整型,表示从UNIX新纪元(Jan 1 1970)来的毫秒数。这一结果表示了可表达的约2亿9000万年范围内的过去和未来。

官方的BSON规范指出DSON日期类型是通用协调时间(UTC datetime)。

BSON日期类型是有符号的,负值表示1970年之前的日期。

例如:

在mongo shell中,使用new Date()构建日期:var mydate1 = new Date()

在mongo shell中,使用ISODate()构建日期:var mydate2 = ISODate()

返回时间值的字符串:mydate1.toString()

返回日期中的月份,日期是基于0索引的,所以一月份就是:mydate1.getMonth()

MongoDB对json的扩展

JSON所表示的类型仅是BSON数据类型的子集。为了表示类型信息,MongoDB对JSON做如下扩展:

  • strict模式。BSON类型的strict模式形式符合JSON RFC。任何的JSON分析器都能够分析这些键值对形式的strict模式形式。然而,仅MongoDB内部的JSON分析器识别转化为这种格式的信息。
  • mongo Shell模式。MongoDB内部的JSON分析器和mongo shell都能解析这种模式。

这种形式被用于各种数据类型,这些类型依赖于JSON被解析的上下文环境。

解析器和支持的格式

以strict模式输入

以下能够解析strict模式形式,识别类型信息。

  • REST Interfaces
  • mongoimport
  • 各种MongoDB工具的查询选项

其他的JSON解析器,包括mongo shell 和db.eval()能够解析键值对形式的strict模式表示,但是不能够识别类型信息。

以mongo Shell 模式输入

以下能够解析mongo Shell模式表达,识别类型信息。

  • REST Interfaces
  • mongoimport
  • 各种MongoDB工具的查询选项
  • mongo shell

以strict模式输出

mongoexport 和REST and HTTP Interfaces以Strict模式输出数据。

以mongo Shell 模式输出

bsondump以mongo Shell 模式输出数据。

BSON数据类型和相关的描述

下面展示了strict模式和mongo Shell模式的一些BSON数据类型及相关描述。

Binary

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(2)

  • <bindata>是base64编码形式的二进制字符串
  • <t> 表示用一个字节指明数据类型。在strict模式中它是十六进制字符串,在mongo Shell模式中它是整数。

Date

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(3)

在strict模式中,<date>是ISO-8601数据格式的强制性时区字段,它的模板为:YYYY-MM-DDTHH:mm:ss.mmm< /-Offset>。

当前的MongoDB JSON解析器不支持加载Unix新纪元之前的ISO-8601 字符串日期。当格式化系统的time_t 类型的纪元之前和之后的时间时,采用下面的格式:{ "$date" : { "$numberLong" : "<dateAsMilliseconds>" } }

在Shell 模式中,<date>是一个64字节有符号整数的JSON形式,这个整数的表示形式为协调世界时间(UTC)的毫秒数。

Timestamp

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(4)

  • <t> 为32位无符号整型UTC毫秒形式的JSON表达
  • <i>为自增的32位无符号整型

Regular Expression(正则表达式)

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(5)

  • <sRegex> 是由有效的JSON字符构成的字符串
  • <jRegex> 是由有效的JSON字符和转义双引号字符构成的字符串,但可能不包含转义的正斜杠(/),
  • <sOptions> 是一个包含以字母表示的正则表达式选项的字符串
  • <jOptions>是一个仅可能包含‘g’ ‘i’ ‘m’ 和‘s’ 的字符串,因为JavaScript和Mongo shell表示支持有限的选择范围,当转化成这种表示时,不合格选项将被丢弃。

OID

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(6)

DB Reference

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(7)

  • <name> 是由有效的JSON字符构成的字符串。
  • <id>是任何有效的JSON扩展类型。

Undefined Type

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(8)

表示为JavaScript/BSON中未定义类型。

查询文档时不能使用未定义类型。将下面的文档插入people 集合:

db.people.insert( { name : "Sally" age : undefined } )

下面的查询会返回一个错误:

db.people.find( { age : undefined } )

db.people.find( { age : { $gte : undefined } } )

然而,可使用$type查询未定义类型:

db.people.find( { age : { $type : 6 } } )

这个查询返回所有age 字段为未定义类型的文档。

MinKey

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(9)

Minkey BSON数据类型的排序低于所有其他类型。

MaxKey

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(10)

MaxKey BSON数据类型的排序高于所有其他类型。

NumberLong(2.6版本新增)

mongodb查询json中的值(NoSQL之MongoDBBSON与JSON类型)(11)

NumberLong 是64位有符号整数,必须使用引号否则它将会被理解为浮点型,这会导致精度丢失。

例如,插入9223372036854775807,却没有将其用引号括起来:

db.json.insert( { longQuoted : NumberLong("9223372036854775807") } )

db.json.insert( { longUnQuoted : NumberLong(9223372036854775807) } )

当查询文档时,longUnquoted 的值改变了,而longQuoted 的值没变。

执行db.json.find(),返回结果为:

{ "_id" : ObjectId("54ee1f2d33335326d70987df") "longQuoted" : NumberLong("9223372036854775807") }

{ "_id" : ObjectId("54ee1f7433335326d70987e0") "longUnquoted" : NumberLong("-9223372036854775808") }

本文内容主要译自官方文档

猜您喜欢: