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操作符基于类型匹配模式检索文档。
比较/排序顺序当比较不同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类型描述了特别的注意事项:
ObjectIdObjectId占据存储空间小、唯一、可被快速生成和索引。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值,这些值并不会严格地按照插入顺序展示。多客户端之间的时钟偏移也会导致不严格排序,即使这些值由客户端驱动程序生成。
StringBSON 的String类型是UTF-8编码的。一般来说,每种语言对应的驱动程序在执行序列化和反序列化BSON时将语言自身的string类型转换为UTF-8编码,这使得BSON string可以接受大多数国际字符。另外,使用$regex 查询支持UTF-8编码的正则表达式字符。
TimestampBSON 中有一个特殊的时间戳类型供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字段。现在服务器会替换任何的顶级字段。
DateBSON 日期类型是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
- <bindata>是base64编码形式的二进制字符串
- <t> 表示用一个字节指明数据类型。在strict模式中它是十六进制字符串,在mongo Shell模式中它是整数。
Date
在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
- <t> 为32位无符号整型UTC毫秒形式的JSON表达
- <i>为自增的32位无符号整型
Regular Expression(正则表达式)
- <sRegex> 是由有效的JSON字符构成的字符串
- <jRegex> 是由有效的JSON字符和转义双引号字符构成的字符串,但可能不包含转义的正斜杠(/),
- <sOptions> 是一个包含以字母表示的正则表达式选项的字符串
- <jOptions>是一个仅可能包含‘g’ ‘i’ ‘m’ 和‘s’ 的字符串,因为JavaScript和Mongo shell表示支持有限的选择范围,当转化成这种表示时,不合格选项将被丢弃。
OID
DB Reference
- <name> 是由有效的JSON字符构成的字符串。
- <id>是任何有效的JSON扩展类型。
Undefined Type
表示为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
Minkey BSON数据类型的排序低于所有其他类型。
MaxKey
MaxKey BSON数据类型的排序高于所有其他类型。
NumberLong(2.6版本新增)
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") }
注本文内容主要译自官方文档