本文是学习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是由时间戳,机器码,进程号,计数器生成。
  • mongodb存储数据类型 mongodb基本数据类型_数据表

  • 前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也能理解内嵌文档的结构,并深入其中构建索引,执行查询,或者更新。
    内嵌文档可能会带来数据的冗余,最好将同类的文档放到另一个集合中操作。