您的位置:首页 > 数据库 > Mongodb

MongoDB学习整理(三)--数据类型介绍

2015-02-28 18:05 246 查看
本文是学习MongDb:The Definitive Guide(Mongodb权威指南)一书做的浅显的整理,请大神们多多指教。

Json是一种简单的数据表示方式,仅有6种数据类型。null、数据、字符串、数组、对象、布尔。由于数据表示的数据类型少,所以Json的表现能力也有限。

MongoDb使用的数据类型是BSON,BSON在保留JSON数据键值对特性的基础上又增加了一些数据类型,如日期,正则等。下面介绍MongoDB的数据类型:

null

null用于表示空值或不存在的键值,{x:null}

布尔

数字

JavaScript只支持一种数据类型,64位浮点数。因为MongoDb中有32位整数,64位整数,64位浮点数三种数字。所以shell必须绕过JavaScript限制。默认情况下,shell中的数字都会被MongoDb当作双精度数。所以尽量不要在shell下覆盖整个文档。

有些64位整数并不能被表示成64位浮点数,所以当在shell中查看时,字会以内嵌文档的形式显示。如文档键integer的值为64位整数3,那么显示结果为:

{_id:ObjectId(""),"myInteger":{"floatApprox":3}}


floatApprox是一种特殊的内嵌文档,可以作为值和文档来操作

>doc.myInteger+1


4


>doc.myInteger.floagApprox


3


上述表示可能不准确,要是内嵌文档只有一个键,那么实际上这个值是准确的。

如果插入的64位整数不能准确的表示为双精度数,那么shell会添加两个键”top”和”bottom”,分别表示高32位和低32位,如:插入9223372036854775807,显示如下:

{


_id:ObjectId("")
,

myInteger:{


"floatApprox":9223372036854775807


"top":2147483647,


"bottom":4294967295


}


}


32位整数都可以精确的表示为64位浮点数

字符串

Utf8字符串都可以表示成字符串类型的数据,{“x”: “char”}

符号

shell不支持符号类型,符号类型数据会被转为字符串存储。

对象id

对象id是文档的12字节唯一id,{“_id”: ObjectId()}

Mongodb中的文档必须有一个_id键,这个键的值可以是任意类型的,默认是ObjectId类型的。不同的机器都可以用全局唯一的同种方法生成ObjectId类型。

MongoDb设计的初衷就是分布式的,所以处理多个节点是一个核心要求。ObjectId类型会在分布式环境中容易生成。

ObjectId占12字节空间,每个字节由两位十六进制数字组成,是一个24位长的字符串。

ObjectId是由时间戳,机器码,进程号,计数器生成。



前4个字节是由标准纪元开始的时间戳,精确到秒级

接下来3个字节是所在机器的唯一标识符,通常是机器散列值

后2个字节是产生ObjectId的进程标识符

最后3个字节是计数据器

前9个字节保证了同一秒不同机器不同进程产生的ObjectId唯一,后3字节确保相同进程同一秒产生的ObjectId也是不同的,同一秒钟最多允许每个进程产生256的3次方(16777216)个ObjectId

ObjectId是由MongoDb自动生成。MongoDb把生成ObjectId的任务交给客户端,这样减轻数据库扩展的负担。同时客户端生成ObjectId,驱动程序可以提供更多的Api。如果驱动程序允许服务器端生成ObjectId,那么将需要单独的查询,以确认插入的ObjectId值是否存在。

日期

日期是从标准纪元开始的毫秒数,不存时区,{“x”: new Date())}。

JavaScript中Date对象用作MongoDb的日期类型,通常调用Date(…)会返回日期的字符串类型,调用new Date(…)才会返回真正的日期对象,这是JavaScript本身的特性,不是MongoDb的特性。MongoDb创建新的日期时会调用new Date(),而不是Date()。

正则表达式

文档中存储的正则表达式采用JavaScript正则表达式语法,{“x”: /baz/i}

代码

文档中可以包含JavaScript代码,{“x”: function(){/* */}}

二进制数据

二进制数据可以由任意字节的串组成,不可shell中不可以使用。

最大值

BSON包括一个特殊的类型,表示可能的最大值,shell中不能使用。

最小值

BSON包括一个特殊的类型,表示可能的最小值,shell中不能使用。

未定义

文档中可以使用未定义类型(null,undefined).null表示没有这个对象或定义,undefined表示有该对象或定义但不应该有值。

数组

值的集合或列表可以表示成数组,{“x”: [“a”,”b”,”c”]}

数据可以包含不同数据类型的元素,MongoDb能理解数组结构,并知道如何深入数组内部操作其内容,这样就能用内容对数组进行查询及构建索引了

内嵌文档

文档可以包含别的文档,也可以做为值嵌入到父文档中,{“x”:{“a”:”b”}}

同数组一样,Mongodb也能理解内嵌文档的结构,并深入其中构建索引,执行查询,或者更新。

内嵌文档可能会带来数据的冗余,最好将同类的文档放到另一个集合中操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息