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}})