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类型描述了特别的注意事项:

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

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

Date

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

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

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

Timestamp

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

Regular Expression(正则表达式)

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

OID

DB Reference

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

Undefined Type

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

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

db.people.insert( { name : "Sally

mongodb查询值不为空_NoSQL之MongoDB——BSON与JSON类型相关推荐

  1. mongodb查询值不为空_MongoDB使用规范(上)

    MongoDB设计规范 1.1 mongoDB库的设计 l 不能为空字符串("") l 不能以$开头 l 不能包含.(点号)和空字符串 l 数据库名区分大小写(建议数据库名全部使用 ...

  2. mongodb查询不带表名_原创 | MongoDB常用指令

    库的操作 1. 查看数据库列表 show dbs: 2. 查看当前数据库 db 3. 新建一个表 db.createCollection('要新建的表名') // 返回结果// {"ok&q ...

  3. mongodb不等于某个值_MongoDb进阶实践之四 MongoDB查询命令详述

    一.引言 上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命名和删除.有了这些基 ...

  4. sql查询字段的值不为空

    sql查询字段的值不为空 SQRJS IS NOT NULL AND SQRJS <![CDATA[ <> ]]> ''

  5. mongodb查询一个字段所有值

    mongodb查询一个字段所有值 db.集合名.find( {}, {需要查询的字段:1, _id:0} ) 例如 db.movies.find({}, {'cover':1, _id: 0}) 1表 ...

  6. MongoDB查询(上)

    MongoDB查询(上) 1.find MongoDB使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数 决定了要返回哪些文档.其形式也是 ...

  7. MongoDB查询实现 笛卡尔积,Union All 和Union 功能

    转载自   MongoDB查询实现 笛卡尔积,Union All 和Union 功能 此篇文章及以后的文章大部分都是从聚合管道(aggregation pipeline)的一些语法为基础讲解的,如果不 ...

  8. 跨mysql和mongodb查询工具_MySQL与MongoDB查询互转

    Mysql与MongoDB查询互转 mongo查询严格要求数据格式! 1.只想查出某些数据,不想全部数据都查出来 mysql:select name from user; mongo: db.user ...

  9. java mongodb 查询 游标_MongoDB find()方法:查询数据

    在关系型数据库中,可以实现基于表的各种各样的查询,以及通过投影来返回指定的列,相应的查询功能也可以在 MongoDB 中实现.同时由于 MongoDB 支持嵌套文档和数组,MongoDB 也可以实现基 ...

最新文章

  1. Spring.Net 能为我们做点什么
  2. python selenium grid_selenium grid 使用
  3. 五大地形等高线特征_高中地理学习中如何快速掌握等高线地形图
  4. 利用curl 多线程 模拟 并发的详解
  5. ICS SIP Call移植
  6. C++课程上 有关“指针” 的小结
  7. xunit-ICollectionFixture
  8. Linux***检测基础学习
  9. Apache PLC4X开发者向企业下最后通牒:如不提供资助将停止支持
  10. php面试题之一——HTML+CSS(基础部分)
  11. C++算法学习(力扣:1254. 统计封闭岛屿的数目)
  12. JavaWeb学习--Servlet认识
  13. Twitter数据抓取的方法(一)
  14. 眼动追踪技术 Eye tracking总结
  15. openfire 加 spark组建局域网聊天室
  16. 实景三维的基石-osgb
  17. 网络负载率计算公式 linux,如何理解Linux CPU负载率的计算方式
  18. 第十一章 面向对象设计
  19. 【Unity3D日常开发】应粉丝邀约,写一篇单例模式在Unity的实际应用,记得一键三连哦
  20. bugku——宽带信息泄露(RouterPassView 查看路由器配置信息)

热门文章

  1. origin数据平滑_研发工程师必备:20条实用origin技能,让作图效率飞起来
  2. nginx输出日志_ingressnginx持久化日志
  3. Android开发之LayoutInflater.from(context).inflate()方法参数介绍解决RecyclerView加载布局不全的问题
  4. Android studio中的NDK开发之NDK环境变量的配置(图文教程)
  5. 杭州人有福了!菜鸟配送升级新增24小时送药服务
  6. pandas的to_csv()使用细节和一些参数
  7. (6)kendo UI使用基础介绍与问题整理——dropdownlist/基础问题整理
  8. R语言比较运算符和逻辑运算符
  9. Tomcat8.01及nginx-1.8.1安装
  10. 程序设计实习MOOC/自增和自减运算符的重载