mongodb查询值不为空_NoSQL之MongoDB——BSON与JSON类型
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类型相关推荐
- mongodb查询值不为空_MongoDB使用规范(上)
MongoDB设计规范 1.1 mongoDB库的设计 l 不能为空字符串("") l 不能以$开头 l 不能包含.(点号)和空字符串 l 数据库名区分大小写(建议数据库名全部使用 ...
- mongodb查询不带表名_原创 | MongoDB常用指令
库的操作 1. 查看数据库列表 show dbs: 2. 查看当前数据库 db 3. 新建一个表 db.createCollection('要新建的表名') // 返回结果// {"ok&q ...
- mongodb不等于某个值_MongoDb进阶实践之四 MongoDB查询命令详述
一.引言 上一篇文章我们已经介绍了MongoDB数据库的最基本操作,包括数据库的创建.使用和删除数据库,文档的操作也涉及到了文档的创建.删除.更新和查询,当然也包括集合的创建.重命名和删除.有了这些基 ...
- sql查询字段的值不为空
sql查询字段的值不为空 SQRJS IS NOT NULL AND SQRJS <![CDATA[ <> ]]> ''
- mongodb查询一个字段所有值
mongodb查询一个字段所有值 db.集合名.find( {}, {需要查询的字段:1, _id:0} ) 例如 db.movies.find({}, {'cover':1, _id: 0}) 1表 ...
- MongoDB查询(上)
MongoDB查询(上) 1.find MongoDB使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数 决定了要返回哪些文档.其形式也是 ...
- MongoDB查询实现 笛卡尔积,Union All 和Union 功能
转载自 MongoDB查询实现 笛卡尔积,Union All 和Union 功能 此篇文章及以后的文章大部分都是从聚合管道(aggregation pipeline)的一些语法为基础讲解的,如果不 ...
- 跨mysql和mongodb查询工具_MySQL与MongoDB查询互转
Mysql与MongoDB查询互转 mongo查询严格要求数据格式! 1.只想查出某些数据,不想全部数据都查出来 mysql:select name from user; mongo: db.user ...
- java mongodb 查询 游标_MongoDB find()方法:查询数据
在关系型数据库中,可以实现基于表的各种各样的查询,以及通过投影来返回指定的列,相应的查询功能也可以在 MongoDB 中实现.同时由于 MongoDB 支持嵌套文档和数组,MongoDB 也可以实现基 ...
最新文章
- Spring.Net 能为我们做点什么
- python selenium grid_selenium grid 使用
- 五大地形等高线特征_高中地理学习中如何快速掌握等高线地形图
- 利用curl 多线程 模拟 并发的详解
- ICS SIP Call移植
- C++课程上 有关“指针” 的小结
- xunit-ICollectionFixture
- Linux***检测基础学习
- Apache PLC4X开发者向企业下最后通牒:如不提供资助将停止支持
- php面试题之一——HTML+CSS(基础部分)
- C++算法学习(力扣:1254. 统计封闭岛屿的数目)
- JavaWeb学习--Servlet认识
- Twitter数据抓取的方法(一)
- 眼动追踪技术 Eye tracking总结
- openfire 加 spark组建局域网聊天室
- 实景三维的基石-osgb
- 网络负载率计算公式 linux,如何理解Linux CPU负载率的计算方式
- 第十一章 面向对象设计
- 【Unity3D日常开发】应粉丝邀约,写一篇单例模式在Unity的实际应用,记得一键三连哦
- bugku——宽带信息泄露(RouterPassView 查看路由器配置信息)
热门文章
- origin数据平滑_研发工程师必备:20条实用origin技能,让作图效率飞起来
- nginx输出日志_ingressnginx持久化日志
- Android开发之LayoutInflater.from(context).inflate()方法参数介绍解决RecyclerView加载布局不全的问题
- Android studio中的NDK开发之NDK环境变量的配置(图文教程)
- 杭州人有福了!菜鸟配送升级新增24小时送药服务
- pandas的to_csv()使用细节和一些参数
- (6)kendo UI使用基础介绍与问题整理——dropdownlist/基础问题整理
- R语言比较运算符和逻辑运算符
- Tomcat8.01及nginx-1.8.1安装
- 程序设计实习MOOC/自增和自减运算符的重载