MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期、32位数字、64位数字等类型。以下对mongoDB的类型进行简要说明:
 
1、 Null[类型编号:10]
null类型用于表示空值或不存在的字段,如:{“x”:null}
 
2、 布尔类型 Boolean[类型编号:8]
布尔类型有两上值,’true’和’false’ ,如:{“x”:true}
 
3、 32位整数 32-bit integer[类型编号:16]
在由于mongoDB的控制台使用JS引擎进行输入,而JS仅支持64位浮点数,所以32位整数将会被自动转义;
 
4、 64位整数 64-bit integer[类型编号:18]
64位整数与32位整数一样,在MongoDB控制台使用时,会转义成64位浮点数。除外,如果数据库本身存储的数据类型无论是32位整数还是64位整数,使用MongoDB控制台获取后,更改其文档记录(即使没有修改整数本身,只修改了文档的其他部分),并重新使用控制台写回数据库,则其数据类型也会变成了64位浮点数。
除外,使用控制台查看一个64位整数时,可能会不正确定,原因是有些64位的整数不能精确表示为64位浮点数,而控制台呈示都是64位浮点数。
 
5、 数值类型:Double[类型编号:1]

在Mongo shell中,默认使用64位浮点型数据。因此,会有以下两种数值形式:

{"x" : 2.32}
//或
{"x" : 2}

对于整数类型,可以使用NumberInt()(位有符号整型)或NumberLong()(8位有符号整型)方法进行转换。示例如下:

{"x" : NumberInt(2)}
{"x" : NumberLong(2)}
 
6、 字符串类型:String[类型编号:2]
MongoDB中字符串类型使用UTF-8编码的字符表示。如:{“x”:”Hello QuickCodes”}
 
7、 符号 Symbol [类型编号:14]
在MongoDB控制台中不支持这种类型,将自动转义成字符串;
 
8、 对象id Object id[类型编号:7]
对象id是文档中唯一的12位的ID ,
在MongoDB来存储文档时,必须有一个“_id”键,这个键可以是任何类型,如果在增加文档时,没有这个_id键,则系统会使用ObjectId对象自动生成一个,在分布式环境中,不同的机器都能用全局唯一的同种方法来生成值,如:{"_id": ObjectId("57110709d1db0802a433a03c")}
其生成规则为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
     时间戳     |     机器   |   PID |    计数器
前4位表示时间戳,时间戳以秒为单位,由于时间戳在前面,可以更好地反映出数据插入时的时间顺序,使的数据更容易查询,建议索引更加容易。
虽然系统会自动创建_id键,但在高并发的应用下建议使用客户端的驱动程序来创建,主要原因是,尽管ObjectId可以生成,但是系统在生成时,还是会产生开销,增加数据库的负担。
在高并发的分布式环境中,只使用以秒为单位的时间戳和机器不能区分其唯一性,故在其后面添加了PID,即MongoDB的进程标识符,前9个字符保证了同一秒钟不同机器不同进程产生的ObjectId是唯一,两位是一个自动递增的计数器,确保相同进程同一秒产生的ObjectId也不一样。

相关函数:ObjectId()、getTimestamp()、valueOf()

 
9 日期 Date [类型编号:9]
MongoDB中日期使用时间戳表示,单位为毫秒,不存储时区。 从标准纪元开始的毫秒数 { “date”:new Date()}
创建日期对象时应该使用new Date(),而非构造函数Date()。将构造函数作为函数时返回的日期格式是字符串,而非日期对象(与JavaScript工作机制有关)。
  • MongoDB中,日期类型是一个64位的整数,它代表的是距Unix epoch的毫秒数
  • MongoDB在存储时间时,先转化为UTC时间

北京时间(CST) = UTC + 8个小时

  • MongoDB Shell中可以使用new Date或ISODate来创建时间对象,在进行显示时,Shell会根据本地时间去设置显示日期对象
10 正则表达式 Regular Expression[类型编号:11]
文档中可以包含正则表达式,遵循 JavaScript 的语法。主要用于查询,使用正则表达式作为限定条件

例如:{name:/foo/  }    name字段含有foo的文档

{name:/foo/i }    name字段含有foo的文档,且不区分大小写

{name:/^foo/i }  name字段以foo开头,且不区分大小写

11 代码 JavaScript(Scope)[类型编号:15]
MongoDB的文档和代码中可以包括JavaScript代码。如:
{"x" : function(){ /*这里是一段JavaScript代码*/}}
 
12二进制数据 Binary data[类型编号:5]
可以保存由任意字节组成的字符串,例如:图片、视频等。任意字节的二进制串组成, shell 不支持 。二进制数据是一个二进制字节的字作串,要保存非UTF-8字符到数据库中,只能使用十进制数据。
 
13 最大值 Max Key [类型编号:127]
表示可能的最大值, shell 不支持
 
14 最小值 Min Key[类型编号:255]
表示可能的最小值, shell 不支持
 
15 未定义 undefined
{ “x”: undefined}
 
16 数组 Array[类型编号:4]
数据集可以用数组格式存储,与JavaSript中的数组表示相同。如:

{"x" : ["cloudev.top", "QuickCodes.Net"]}
数组中可以包含不同类型的数据元素,包括内嵌文档和数组等。所有MongoDB中键-值对支持的数据类型都可以用做数组的值。
  • 数组是使用方括号来表示的一组值,它既可以作为有序对象(列表、栈、队列),也能作为无序对象(如集合)来操作
  • 数组中可以包含不同数据类型的元素(字符串、浮点数、文档等)                 例如:[ 3.14,"hello",[1,2,3] ,{"key":"MongoDB"} ]
  • 针对数组MongoDB提供了许多特定的操作符,例如:$push,$pop,$pull,$slice,$addToSet等
  • MongoDB 可自动的为数组元素建立Multikey 索引
 
17内嵌文档
文档可以作为文档中某个 key 的value。在MongoDB文档总大小限制为16MB,建议使用子文档的形式组织数据,子文档查询效率要高于多键查询。

{

"_id": ObjectId("57110709d1db0802a433a03c"),

title:"Hello QuickCodes",

author:"Mac.Manon",

      comments:[

       {nickname:"Peter",comment:"Ok"},

       {nickname:"Tom",comment:"Dig"} ]

}

文档可以做为键的值,即:内嵌文档。MongoDB与关系型数据库相比,最大的优势就是内嵌文档。与关系型数据库的扁平化数据结构相比,使用内嵌文档可以数据的组织方式更加自然。

18.时间戳 Timestamp [类型编号:17]

时间戳类型有两部分组成:32 bit-Unix epoch 和 32 bit-自增序数(同一秒)

Timestmp 只供MongoDB 数据库服务内部使用,用于记录操作的详细时间;

Timestamp 类型和Date类型是没有关系的,对于我们来说使用更多的Date类型;

相关函数:Timestamp()

 
上述数据类型,均有一个类型编号,如字符串型的类型编号为2,下面的指令会在user表查找字段名称为name,且数据保存为字符串格式的数据:

db.user.find({name:{$type:2}})

MongoDB入门教程三[数据类型]的更多相关文章

  1. MongoDB入门教程一[文档与集合]

    MongoDB 是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同.举个例子,在关系型数据库中,我们记录一个订单的信息,通常是这样设计表结构的: 设计一个订单基本信息表和一个订 ...

  2. MongoDB入门教程二[MongoDB Shell 简介与使用]

    MongoDB Shell 是MongoDB自带的JavaScript Shell,随MongoDB一同发布,它是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的 ...

  3. mongodb入门教程

    title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...

  4. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  5. 无废话ExtJs 入门教程三[窗体:Window组件]

    无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...

  6. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  7. MongoDb 入门教程

    MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...

  8. PySide——Python图形化界面入门教程(三)

    PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  9. RabbitMQ入门教程(三):Hello World

    原文:RabbitMQ入门教程(三):Hello World 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog. ...

随机推荐

  1. Windows10安装配置python2.7+scrapy环境

    环境: windows10企业版x64 过程: 下载python-2.7.13.msi,安装,将以下路径添加到 PATH 中: C:\Python27\;C:\Python27\Scripts\; 安 ...

  2. call 大佬 三分姿势

    为什么注释掉的三分方式不能过 @大佬 题目来源:http://hihocoder.com/problemset/problem/1142?sid=1003381 貌似不是eps的问题 #include ...

  3. Java并发编程原理与实战三十八:多线程调度器(ScheduledThreadPoolExecutor)

    在前面介绍了java的多线程的基本原理信息:线程池的原理与使用 本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分. 我们如果要用j ...

  4. List(JDK1.7)(3)

    Vector 实现了一个存储对象的增长数组.如同一个数组,它可以使用一个整型下标来访问元素.但是,vector的大小是可以根据需要增长或收缩的. 每个vector通过维护capacity和capaci ...

  5. soj1049.Mondriaan

    1049. Mondriaan Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Squares and rectangl ...

  6. MI-NOTE黑砖

    机型:MI NOTE LTE  miui7刷机老是报错,remote:partition table doesn't exist,分区表不存在,于是使用磁盘模式,也看到警告不要中途拔下来,但是不知道是 ...

  7. Infinite Fraction Path(HDU6223 + bfs + 剪枝)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6223 题目: 题意: 给你一个长度为n的数字串,开始时你选择一个位置(记为i,下标从0开始)做为起点 ...

  8. CF264B Good Sequences

    传送门 Description: 松鼠丽丝特别喜欢n个她称之为“好整数”的整数:a1,a2,……,an.(会输入) 现在,她对“好序列”很感兴趣.如果一个序列x1,x2,...,xk能够满足一下三个条 ...

  9. Android笔记之广播

    为了容易理解,可以将广播代入到事件模型中,发送广播消息看做是触发event,BroadcastReceiver是处理事件的回调逻辑. 广播这种模型中涉及到两个角色,就是广播的发送者和接收者,所以会涉及 ...

  10. Sublime遇见中文乱码问题?

    今天在写demo的时候,突然发现html页面上的中文在浏览器上显示乱码~!!!!! 这时,我根据网上的提示安装了两个插件:converttoUtf-8,support Gbk ~~~然而,好像无济于事 ...