章节:第二章 入门
时间:2013-07-19
内容:
文档
多个键及其关联的值有序的放置在一起便是文档
文档是MOngoDB中数据的基本单位,类似于关系型数据库中的行;
文档中的键/值对是有序的
文档中的值不仅可以是在双引号里面的字符串,还可以是其它几种数据类型
键不能含有\0(空字符),这个字符用来表示键的结尾
.和$有特别的意义,只有在特定环境下才能使用
以下划线“_”开头的键是保留的
MongoDB不但区分类型,也区分大小写
MongoDB的文档不能有重复的键
每个文档都有一个特殊的键“_id”,它在文档所处的集合中是唯一的
集合
集合就是一组文档,可以被看做是没有模式的表
集合的无模式,意味着一个集合里面的文档可以是各式各样的
把同种类型的文档放在一个集合里,这样数据会更加集中
当创建索引时,文档会有附加结构;索引时按照集合来定义的,把同种类型的文档放入同一个集合里面,可以使索引更加有效
集合的命名:
集合名不能是空字符串“”
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾
集合名不能以“system”开头,此为系统集合保留的前缀
用户创建的集合名不能含有保留字符$
子集合
组织集合的一种惯例是使用”.”字符分开的按命名空间划分的子集合
数据库
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限
数据库的命名(因数据库名最终会变成文件系统里的文件,故限制较多):
不能是空字符串(“”)
不得含有‘’(空格)、.、$、/、\和\0(空字符)
应全部小写
最多64字节
保留的数据库名:
admin:即“root”数据库,可添加数据库管理账号,列出所有的数据库或关闭服务器等
local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config:当MongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
把数据库名放在集合名前面,得到就是集合的完全限定名,成为命名空间,如cms.blog.posts
命名空间的长度不得超过121字节,在实际使用中应该小于100字节
启动MongoDB
MongoDB一般作为网路服务器来运行,客户端可以连接到该服务器并执行操作
要启动该服务器,需要运行mongod可执行文件:./mongod
默认数据目录/data/db,需提前创建,否则会导致启动失败
MongoDB监听27017端口,等待连接;
mongod还会启动一个非常基本的HTTP服务器,监听28017端口(比主端口号高1000),可以通过浏览器访问http://localhost:28017来获取数据库的管理信息
MongoDB shell
MongoDB自带一个JavaScriptshell,可以从命令行与MongoDB实例交互
运行shell
启动shell: ./mongo(shell会在启动时自动连接MongoDB服务器,所以要确保在使用shell之前启动mongod)
shell是功能完备的JavaScript解释器,可以运行任何JavaScript程序
MongoDB客户端
Shell开启的时候,会连到MongoDB服务器的test数据库,并将这个数据库连接赋值给全局变量db,这个变量是通过shell访问MongoDB的主要入口点
Shell还有些非JavaScript语法的扩展,是为了方便习惯于SQL shell的用户而添加的,如选择数据库操作:use foobar
Shell中的基本操作(CRUD)
创建(Create):insert函数添加一个文档到集合里面,如db.blog.insert(post)
读取(Read):find函数会返回集合里面所有的文档,findOne函数只查看一个文档,如db.blog.findOne()
更新(Update):update函数接受(至少)2个参数,第一个是要更新文档的限定条件,第二个是新的文档,如db.blog.update({title:”My Blog Post”},post)
删除(Delete):remove函数用来从数据库中永久性的删除文档;在不使用参数进行调用的情况下,它会删除一个集合内的所有文档;它也可以接受一个文档以指定限定条件,如db.blog.remove({title:”My Blog Post”})
使用Shell的窍门
Shell本身内置了帮助文档,可以通过help命令来查看
db.help()可以查看数据库级别的命令的帮助;db.foo.help()可以查看集合的相关帮助
在输入时不输括号,可以显示函数的JavaScript源代码,如db.foo.update
如果集合名恰好是数据库类的一个属性,则访问就会出现问题,如db.version
当JavaScript只有在db中找不到指定的属性时,才会将其作为集合返回
当有属性与目标集合同名时,可以使用getCollection函数,如db.getCollection(“version”)(此处version是集合名)
数据类型
基本数据类型
JSON是一种简单的表示数据的方式,仅包含6种数据类型:null、布尔、数字、字符串、数组和对象,故表现力受限
MongoDB在保留JSON基本的键/值对特性的基础上,添加了其它一些数据类型:
null:用于表示空值或者不存在的字段
布尔:ture或false
32位整数:shell中不支持此类型,会被自动转换成64位浮点数
64位整数:shell中不支持此类型,会用一个特殊的内嵌文档来显示
64位浮点数:shell中的数字都是此种类型
字符串:UTF-8字符串都可以表示为字符串类型的数据
符号:shell不支持此类型,会将其转换成字符串
对象id:是文档的12字节的唯一ID
日期:日期类型存储的是从标准纪元开始的毫秒数,不存储时区
正则表达式:文档中可以包含正则表达式,采用JavaScript的正则表达式语法
代码:文档中可以包含JavaScript代码
二进制数据:shell中不支持此类型,二进制数据可以由任意字节的串组成
最大值:shell中不支持此类型,表示可能的最大值
最小值:shell中不支持此类型,表示可能的最小值
未定义:undefined,和null是不同的类型
数组:值的集合或者列表可以表示成数组
内嵌文档:文档可以包含别的文档,也可以作为值嵌入到父文档中
数字
JavaScript中只有一种“数字”类型,因为MongoDB中有3种数字类型(32位整数、64位整数和64位浮点数),shell必须绕过JavaScript的限制
若从数据库中获得的是一个32位整数,修改文档后,将文档存回数据库的时候,这个整数也被转换成64位浮点数,所以明智的做法是尽量不要在shell下覆盖整个文档
日期
在JavaScript中,Data对象用作MongoDB的日期类型,创建一个新的Date对象时,通常会调用new Date(…)而不只是Date(…)
Shell中的日期显示时使用本地时区设置,但是日期在数据中是以从标准纪元开始的毫秒数的形式存储的,没有与之相关的时区信息
数组
数组是一组值,既可以作为有序对象(如列表、栈或队列)来操作,也可以作为无序对象(像集合)操作
数组中可以包含不同数据类型的元素(如字符串和浮点数混合)
MongoDB能“理解”数组结构,并知道如何“深入”数组内部对其内容进行操作
MongoDB可以使用原子更新修改数组中的内容
内嵌文档
内嵌文档就是把整个MongoDB文档作为另一个文档中键的一个值,这样数据可以组织的更自然些,不用非得存成扁平结构的
同数组一样,MongoDB能够理解内嵌文档的结构,并能深入其中构建索引、执行查询、或者更新
内嵌文档可以改变处理数据的方式,使得信息表示更加自然,但也会存储更多重复的数据,这样是反规范化的
vi._id和ObjectId
MongoDB中存储的文档必须有一个“_id”键,这个键的值可以是任何类型的,默认是个ObjectId对象
在一个集合里面,每个文档都有唯一的“_id”值,来确保集合里面每个文档都能被唯一识别
ObjectId是“_id”的默认类型,它设计成轻量型的,不同的机器都能用全局唯一的同种方式方便的生成
ObjectId的组成结构:使用12字节的存储空间,每个字节2位十六进制数字
前4个字节(0-3)是从标准纪元开始的时间戳,单位为秒
接下来的3个字节(4-6)是所在主机的唯一标识符,通常是机器主机名的散列值,以确保不同主机生成不用的ObjectId
再接下来的2个字节(7-8)来自产生ObjectId的进程标示符(PID)
前9个字节保证了同一秒不同机器不同进程产生的ObjectId是唯一的,最后3个字节(9-11)是一个自动增加的计数器,确保相同进程同一秒产生的ObjectId也是不一样的
自动生成_id:
_id通常会在客户端由驱动程序来生成,是为了减少服务器端的开销;将事务交由客户端来处理,就减轻了数据库扩展的压力
在客户端生成ObjectId,驱动程序能够提供更加丰富的API
转载于:https://blog.51cto.com/xxrenzhe/1252773