MongoDB数据类型介绍
monggoDB中的数据都存储在文档中,传输、存储方式使用了类似于JSON称为BSON的数据格式,但数据类型更加丰富,下面对mongodb中的数据类型以及类型在shell中的处理进行说明:
- Null
用于表示空或者不存在的数据。例如:{'x':null}
- Boolean
通用的布尔类型,true或者false.例如:{'x':false}
- 32位整数
在shell中没有此类型,java中有interger。shell会自动转换该类型为64位整数。
- 64位整数
shell中没有此类型,shell使用一个特殊的内嵌文档来表示64位整数。此类型的数据在shell中查看的时候,当可以正确的使用64位浮点数表示时,就直接使用数字表示;如果不能使用64位浮点数正确表示,mongodb的内嵌文档会表示此数据。例如9223372036854775807在shell中的表示为:
db.nums.findOne()
{
"_id":ObjectId("xxxxxxxxx"),
"myInteger":{
"floatApprox":9223372036854775807,
"top":2147483647,
"bottom":4294967295
}
}
注意,如果用shell编辑更改后,该数字会变成64位浮点数。
- 64位浮点数
shell中所有的数字都是该类型。由于shell中只支持此类型而mongoDB支持3中数字类型,那么当mongodb中的32/64位整数在shell中操作后,使用shell再次存入到mongodb中时,所有的数据类型都会转化为64位浮点数。所以最好不要轻易的在shell中对数字进行修改操作。
- 字符串
最常见的数据类型之一。
- 符号
shell中不支持该类型,会自动转化为字符串
- 对象id
对象id是文档的12字节的唯一ID。每个集合中只能有唯一的objectId。12字节的意义:
前4字节是从标准纪元开始的时间戳,4-6字节表示机器名的散列值,7、8字节表示进程ID,后边3个字节表示计数器
- 日期
日期类型存储的是从标准纪元开始的毫秒数,没有时区。使用new Date('xxxx')来创建日期对象,而不是Date('xxxx')。同时,在mongoDB中存储的日期类型是没有时区的,如果需要,添加一个新的键来表示时区。
- 正则表达式
与JS中的正则表达式相同。
- 代码
文档中可以保存JS代码。
- 二进制数据
可以任意存储二进制数据,但是在shell中无法使用
- 最大值
文档中的特殊类型,shell中无法使用。
- 最小值
文档中的特殊类型,shell无法使用。
- 未定义
也就是JS中的undefined,注意,和JS中一样null和undefined是不一样的。
- 数组
值的集合或者列表可以表示成数组,如同所有的弱类型语言,python、php、js,数组元素可以是不同类型的对象。例如:{'x':['a','b','c']}
- 内嵌文档
文档可以包含别的文档,也可以作为值嵌入到父文档中。例如:{'x':{'foo':'bar'}}
不同数据类型的比较
由于MongoDB中不同文档的同一个key的value数据类型可以不同,当我们根据某个key查询的时候会发生不同数据类型之间的比较。所以MongoDB内部设定了数据类型间的大小,顺序如下:
最小值<null<数字(32位整数、63位整形、64位浮点数)<字符串<对象/文档<数组<二进制数据<对象ID<布尔型<日期型<时间戳<正则<最大值