章节:第二章 入门

时间:2013-07-19

内容:

  1. 文档

    1. 多个键及其关联的值有序的放置在一起便是文档

    2. 文档是MOngoDB中数据的基本单位,类似于关系型数据库中的行;

    3. 文档中的键/值对是有序的

    4. 文档中的值不仅可以是在双引号里面的字符串,还可以是其它几种数据类型

    5. 键不能含有\0(空字符),这个字符用来表示键的结尾

    6. .$有特别的意义,只有在特定环境下才能使用

    7. 以下划线“_”开头的键是保留的

    8. MongoDB不但区分类型,也区分大小写

    9. MongoDB的文档不能有重复的键

    10. 每个文档都有一个特殊的键“_id”,它在文档所处的集合中是唯一的

  2. 集合

    1. 集合就是一组文档,可以被看做是没有模式的表

    2. 集合的无模式,意味着一个集合里面的文档可以是各式各样的

    3. 把同种类型的文档放在一个集合里,这样数据会更加集中

    4. 当创建索引时,文档会有附加结构;索引时按照集合来定义的,把同种类型的文档放入同一个集合里面,可以使索引更加有效

    5. 集合的命名:

      1. 集合名不能是空字符串“”

      2. 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾

      3. 集合名不能以“system”开头,此为系统集合保留的前缀

      4. 用户创建的集合名不能含有保留字符$

    6. 子集合

      1. 组织集合的一种惯例是使用”.”字符分开的按命名空间划分的子集合

  3. 数据库

    1. MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限

    2. 数据库的命名(因数据库名最终会变成文件系统里的文件,故限制较多):

      1. 不能是空字符串(“”)

      2. 不得含有‘’(空格)、.$/\\0(空字符)

      3. 应全部小写

      4. 最多64字节

    3. 保留的数据库名:

      1. admin:即“root”数据库,可添加数据库管理账号,列出所有的数据库或关闭服务器等

      2. local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合

      3. config:当MongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

    4. 把数据库名放在集合名前面,得到就是集合的完全限定名,成为命名空间,如cms.blog.posts

    5. 命名空间的长度不得超过121字节,在实际使用中应该小于100字节

  4. 启动MongoDB

    1. MongoDB一般作为网路服务器来运行,客户端可以连接到该服务器并执行操作

    2. 要启动该服务器,需要运行mongod可执行文件:./mongod

    3. 默认数据目录/data/db,需提前创建,否则会导致启动失败

    4. MongoDB监听27017端口,等待连接;

    5. mongod还会启动一个非常基本的HTTP服务器,监听28017端口(比主端口号高1000),可以通过浏览器访问http://localhost:28017来获取数据库的管理信息

  5. MongoDB shell

    1. MongoDB自带一个JavaScriptshell,可以从命令行与MongoDB实例交互

    2. 运行shell

      1. 启动shell ./mongoshell会在启动时自动连接MongoDB服务器,所以要确保在使用shell之前启动mongod

      2. shell是功能完备的JavaScript解释器,可以运行任何JavaScript程序

    3. MongoDB客户端

      1. Shell开启的时候,会连到MongoDB服务器的test数据库,并将这个数据库连接赋值给全局变量db,这个变量是通过shell访问MongoDB的主要入口点

      2. Shell还有些非JavaScript语法的扩展,是为了方便习惯于SQL shell的用户而添加的,如选择数据库操作:use  foobar

    4. Shell中的基本操作(CRUD)

      1. 创建(Create):insert函数添加一个文档到集合里面,如db.blog.insert(post)

      2. 读取(Read):find函数会返回集合里面所有的文档,findOne函数只查看一个文档,如db.blog.findOne()

      3. 更新(Update):update函数接受(至少)2个参数,第一个是要更新文档的限定条件,第二个是新的文档,如db.blog.update({title:”My Blog Post”},post)

      4. 删除(Delete):remove函数用来从数据库中永久性的删除文档;在不使用参数进行调用的情况下,它会删除一个集合内的所有文档;它也可以接受一个文档以指定限定条件,如db.blog.remove({title:”My Blog Post”})

    5. 使用Shell的窍门

      1. Shell本身内置了帮助文档,可以通过help命令来查看

      2. db.help()可以查看数据库级别的命令的帮助;db.foo.help()可以查看集合的相关帮助

      3. 在输入时不输括号,可以显示函数的JavaScript源代码,如db.foo.update

      4. 如果集合名恰好是数据库类的一个属性,则访问就会出现问题,如db.version

      5. JavaScript只有在db中找不到指定的属性时,才会将其作为集合返回

      6. 当有属性与目标集合同名时,可以使用getCollection函数,如db.getCollection(“version”)(此处version是集合名)

  6. 数据类型

    基本数据类型

    1. JSON是一种简单的表示数据的方式,仅包含6种数据类型:null、布尔、数字、字符串、数组和对象,故表现力受限

    2. MongoDB在保留JSON基本的键/值对特性的基础上,添加了其它一些数据类型:

      1. null:用于表示空值或者不存在的字段

      2. 布尔:turefalse

      3. 32位整数:shell中不支持此类型,会被自动转换成64位浮点数

      4. 64位整数:shell中不支持此类型,会用一个特殊的内嵌文档来显示

      5. 64位浮点数:shell中的数字都是此种类型

      6. 字符串:UTF-8字符串都可以表示为字符串类型的数据

      7. 符号:shell不支持此类型,会将其转换成字符串

      8. 对象id:是文档的12字节的唯一ID

      9. 日期:日期类型存储的是从标准纪元开始的毫秒数,不存储时区

      10. 正则表达式:文档中可以包含正则表达式,采用JavaScript的正则表达式语法

      11. 代码:文档中可以包含JavaScript代码

      12. 二进制数据:shell中不支持此类型,二进制数据可以由任意字节的串组成

      13. 最大值:shell中不支持此类型,表示可能的最大值

      14. 最小值:shell中不支持此类型,表示可能的最小值

      15. 未定义:undefined,和null是不同的类型

      16. 数组:值的集合或者列表可以表示成数组

      17. 内嵌文档:文档可以包含别的文档,也可以作为值嵌入到父文档中

    3. 数字

      1. JavaScript中只有一种“数字”类型,因为MongoDB中有3种数字类型(32位整数、64位整数和64位浮点数),shell必须绕过JavaScript的限制

      2. 若从数据库中获得的是一个32位整数,修改文档后,将文档存回数据库的时候,这个整数也被转换成64位浮点数,所以明智的做法是尽量不要在shell下覆盖整个文档

    4. 日期

      1. JavaScript中,Data对象用作MongoDB的日期类型,创建一个新的Date对象时,通常会调用new Date(…)而不只是Date(…)

      2. Shell中的日期显示时使用本地时区设置,但是日期在数据中是以从标准纪元开始的毫秒数的形式存储的,没有与之相关的时区信息

    5. 数组

      1. 数组是一组值,既可以作为有序对象(如列表、栈或队列)来操作,也可以作为无序对象(像集合)操作

      2. 数组中可以包含不同数据类型的元素(如字符串和浮点数混合)

      3. MongoDB能“理解”数组结构,并知道如何“深入”数组内部对其内容进行操作

      4. MongoDB可以使用原子更新修改数组中的内容

    6. 内嵌文档

      1. 内嵌文档就是把整个MongoDB文档作为另一个文档中键的一个值,这样数据可以组织的更自然些,不用非得存成扁平结构的

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

      3. 内嵌文档可以改变处理数据的方式,使得信息表示更加自然,但也会存储更多重复的数据,这样是反规范化的

    7. vi._idObjectId

      1. MongoDB中存储的文档必须有一个“_id”键,这个键的值可以是任何类型的,默认是个ObjectId对象

      2. 在一个集合里面,每个文档都有唯一的“_id”值,来确保集合里面每个文档都能被唯一识别

      3. ObjectId是“_id”的默认类型,它设计成轻量型的,不同的机器都能用全局唯一的同种方式方便的生成

      4. ObjectId的组成结构:使用12字节的存储空间,每个字节2位十六进制数字

      5. 4个字节(0-3)是从标准纪元开始的时间戳,单位为秒

      6. 接下来的3个字节(4-6)是所在主机的唯一标识符,通常是机器主机名的散列值,以确保不同主机生成不用的ObjectId

      7. 再接下来的2个字节(7-8)来自产生ObjectId的进程标示符(PID

      8. 9个字节保证了同一秒不同机器不同进程产生的ObjectId是唯一的,最后3个字节(9-11)是一个自动增加的计数器,确保相同进程同一秒产生的ObjectId也是不一样的

    8. 自动生成_id

      1. _id通常会在客户端由驱动程序来生成,是为了减少服务器端的开销;将事务交由客户端来处理,就减轻了数据库扩展的压力

      2. 在客户端生成ObjectId,驱动程序能够提供更加丰富的API