易于使用
MongoDB是一个面向文档(document-oriented)的数据库,而不是关系型数据库;
MongoDB里的“文档”(document)对应关系性数据库里的“行”(row);
通过在文档里嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层次关系;
不再有预定模式:文档的键(key)和值(value)不再是固定的大小和类型。
易于拓展
纵向拓展就是使用计算能力更强的机器,而横向拓展就是通过分区将数据分散到更多的机器上。通常,纵向拓展是最省力的做法,其缺点是大型机器一般都非常昂贵,而且当数据量达到机器的物理极限时,无论花再多钱也买不到更强的机器了。而横向拓展需要增加存储空间或者提高性能,只需要购买一台普通的服务器并把它添加到集群中就可以了,看起来横向既便宜友容易拓展,不过管理100台机器可显然比管理一台机器要困难得多。
MongoDB的设计采用横向拓展。面向文档的数据模型使它很容易能够在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载自动重新分配文档,以及将用请求路由到正确的机器上。如果有一个集群需要更大的容量,只需要向集群中添加新服务器,MongoDB就会自动将现有的数据向新服务器传送。
丰富的功能
索引(indexing):支持通用二级索引,允许多种快速查询,而且提供唯一索引,符合索引,地理空间索引以及全文索引;
聚合(aggregation):“聚合管道”,用户能够通过简单的片段创建复杂的聚合,并通过数据库自动优化;
特殊的聚合类型:存在时间有限的集合,适用于那些在某些时刻过期的的数据,也支持固定大小的集合,用于保存近期的数据;
文件存储(file storage):支持非常易用的协议,用于存储的大文件和文件元数据。
卓越的性能
MongoDB能够对文档进行动态填充,也能预分配的数据文件以利用额外的空间来换取稳定的性能。MongoDB把尽可能多的内存用作缓存,试图为每次查询自动选择正确的索引。
基础知识
文档是MongoDB中数据的基本单元,类似与关系性数据库中的“行”
集合(collection)可以看作是一个拥有动态模式的表
MongoDB的一个实例可以拥有多个相互独立的数据库,每个数据库都拥有属于自己的集合
每个文档都有一个特殊的键“_id”,这个建在文档所属的集合中是唯一的
MongoDB自带了一个简单但是功能强大的Javascript shell,可用于管理MongoDB的实例或者数据库
- 文档
文档就是键值对的一个有序集。每种编程语言表示文档的方法不太一样,但大多数编程语言都有一些相同的数据结构,比如映射(map),散列(hash)或字典(dictionary)。
文档的键是字符串。除了少数情况以外,键可以使用UTF-8字符
键不能使用含\0(空字符)。这个字符用于表示键的结尾
.和$由特殊含义,只能在特定的环境中使用。通常这两个字符是被保留的
MongoDB不去分类型,但是区分大小写
文档中不能存在重复的键
- 集合
集合就是一组文档。相当于关系型数据库中的一张“表”。
动态模式
集合是动态模式的。者意味着一个集合里面的文档可以是各种各样的。
将文档按类型区分放在不同的集合的原因:
方便管理
查询特定文档时分开查询速度更快
同类型的文档放在一个集合中,数据会更加集中
可以更加更加有效的创建索引
命名
集合使用名称标识。集合名可以是符合一下标准的任意UTF-8字符串:
不能是空字符串
不能包含\0字符,这个字符表示集合名结束
不能以“system.”开头,这是系统集合保留的前缀
不能包含保留字符 ‘$‘
子集合
组织集合使用一种惯例是“.”分隔不同的z命名空间的子集合。
GridFS(一种用于存储大文件的协议)使用子集合来存储文件的元数据,这样就可以与文件内容块很好的隔离开来
大多数驱动程序都提供了一些语法糖,用于访问制定集合的子集合。
- 数据库
多个文档组成集合,多个集合组成数据库。
数据库名规范:
不能是空字符串
字母数字下划线
区分大小写,简单起见最好全部小写
最多为64字节
数据库最终会变成文件系统中的文件,而数据库名就是相应的文件名。
系统保留数据库:
admin:这是“root”数据库。将用户添加到这个数据库,这个用户将获得所有的权限,另外一些特定的服务器端命令只能从admin数据库运行;
local:这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中;
config:用于分片时设置,分片信息存储在这个数据库中。
启动MongoDB
启动:
mongod
默认数据目录:/data/db
端口:27017
mongod还会启动一个非常基本的HTTP服务器,访问 http://localhost:28017 能获取数据库的管理信息
MongoDB shell简介
MongoDB自带一个Javascript shell,可以在shell中使用命令行与MongoDb进行交互。
运行shell
启动:
mongo
此shell是一个功能完备的Javascript解释器,可以运行任意Javascript程序。
- MongoDB客户端
上面启动的这个shell不仅能运行JS程序,而且它是一个独立的MongoDB客户端,启动时shell会连接到MongoDB服务器的test数据库,并将数据库连接赋值给全局变量db,这个变量是通过shell访问MongoDb的主要入口点。
查看db当前指向哪一个数据库:
db
test
为了方便习惯使用SQL shell的用户,shell还包含一些非Javascript语法的拓展。这些拓展并不提供额外的功能,二是一些非常棒的语法糖。如:
选则数据库:
use acmshow
switched to db acmshow
db
acmshow
shell基本操作
创建:insert
查询:find和findOne,find会自动显示最多20个匹配的文档
更新:update,接受两个参数:限定条件和新的文档
删除:remove,接受一个限定参数
- 数据类型
基本数据类型
在概念上MongoDB文档和Javascript中的对象相近,因而可以认为它类似于JSON。JSON只有6种数据类型:null,布尔,数字,字符串,数组和对象。然而JSON没有日期类型, 也无法区分浮点数和正整数,更别说区分32位和64位了,再者JSON也无法表示一些通用类型如正则表达式。
MongoDB在保留了JSON的键值对特性的基础上,添加了其他一些数据类型:
null
布尔
数值:默认使用64位浮点型值NumberInt(4字节带符号整数)或者NumberLong(8字符带符号整数)
字符串:所有UTF-8字符串
日期
正则表达式
数组
内嵌文档
对象ID
二进制数据
代码
日期
Date类可以用作MongoDB的日期类型。shell根据本地时区设置显示日期对象,然而数据库中存储的日期仅为新纪元以来的毫秒数,并未存储对应时区。
数组
数组是一组值,它既能作为有序对象(如列表,栈或队列),也能作为无序对象(如数据集)来操作。常规的键/值对支持所有值都可以作为数组的值,数组中甚至可以嵌套数组。
内嵌文档
文旦可以作为键的值,这样的文档就是内嵌文档。使用内嵌文档,可以使数据组织方式更加自然,不用非得存成扁平结构的键值对。
_id和ObjectId
ObjectId是"_id"的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便的生成它。这是MongoDB采用ObjectId,而不是其他比较常规的做法(比如说自动增加主键的原因),因为在多个服务器上同步自动增加主键值费时又费力/。因为设计MongoDB的初衷就是用作分布式数据库,所以能够在分片环境中生成唯一的标识符非常的重要。
使用MongoDB shell
$ mongo some-host:30000/myDB
MongoDB shell version: 2.4.0
connecting to: some-host:30000/myDB
db现在就指向了some-host:30000 上的 myDB 数据库。
帮助:help
执行脚本如 $ mongo test.js 然后mongo会依次执行传入的脚本,然后退出
也可以从交互式shell中执行脚本 > load("script1.js")
在脚本中可以访问db变量以及其他的全局变量
如果某些脚本需要频繁加载,可以将他们添加到mongorc.js文件中,这个文件会在启动shell时自动运行。