认识MongoDB
http://my.oschina.net/23102160/blog/101651
1.1 什么是MongoDB
这个去官方网站看http://www.mongodb.org
1.2 什么是文档(Document)
是多个键及其关联的值有序的放在一起就叫做文档,类似于关系型数据库里面的记录(行),通常表现形式就是键值:
1 |
{ "name" : "Mongo" } |
2 |
{ "name" : "CC" , "type" : "Beginer" } |
键/值对是在NOSQL非常重要的一个概念。(Redis也是键值对,不过操作方式有区别)
CC注:在这里面大小写是敏感的哦~
1.3 什么是集合(Collection)
说简单一点集合就相当于SQL里面的表,在MongoDB里面就是指的一组文档。
要查看当前数据库中的集合有两种方式:
1 |
> show collections |
2 |
> show tables |
第二种完全是为了配合那些关系型数据库的童鞋。
1.4 数据库
同理,多个集合组成就是数据库(感觉有点牵强)。数据库命名是有规则的,同样集合命名也有限制,数据库名满以下条件的UTF-8字符串都可以:
尽量小写,不能是空字符串,不得含有一些特殊符号比如”’’”(空白)、”.”、”$”、”/”、”\”、”\0”等,这样的符号(这些符号主要是为了避免冲突,在系统的默认代码中有的会使用),还有就是最多64个字符。(主要数据库的名字最后会变成文件名,所以这也是限制一些字符的原因)
还有一些就是系统保留了的名字,比如admin(一些特定的数据命令只能在这个库,这个库也是root数据库),local(这个主要是关于复制和本地数据库),config(主要用于保存分片信息)。
这里有个概念叫命名空间,当然和C++在意义上也差不多,把数据库的名字放到集合的前面得到的就是命名空间,也称为集合的完全限定名。命名空间的长度不得超过121,一般100就可以了,这个是MongoDB的权威指南说的哦!
默认链接test数据库,并将这个数据库连接复制给全局变量db,所以查看当前数据库用
1 |
> db |
查看所有数据库名称用
1 |
> show dbs |
选择其他数据库用
1 |
> use databaseName |
1.5 安装,启动MongoDB,运行shell
安装得看你在什么平台上安装,CC是在CentOS下面装的,具体的安装文件就去官方网站看就行了,安装方法就不过多介绍了。
启动MongoDB以Linux为例,(一般都是开机自启动的,毕竟是服务程序嘛),运行./mongod就行了,不过你得指定一些参数,比如数据库目录,权限,主从服务器什么的,具体的可以带上参数 –help 来查看。
启动了服务之后,我们就可以真正的进入Shell来开始我们的工作了。
CC注:进入shell后,可以用help来查看一些命令,如果记不住命令的全称,按下Tab来自动补全是一个不错的选择。
1.6 MongoDB中的基础数据类型
本章最后说一说一些数据类型。(在以后的编辑中可能回来补充)
数字和字符串这些都是常用的,对象id类似于主键,然后比较hot的就是数组和内嵌文档。
1.6.1 null
这个很神奇的东西,在不同的数据库里面处理方式也不是一样,在后面遇上的时候会有具体介绍(目前CC知道的就是在查询或者修改时候的限定条件时候要注意)。
1 |
{“name”:null} |
1.6.2 布尔
就是true和false了,(貌似在以前版本的时候只有1和0,不过现在都可以,这个注意一下比较好)
1 |
{“ yes ”: true } |
1.6.3 数字
数字有三种:
32位整数、64位整数这两种说有,不过不支持(JS只支持64位浮点数)
64位浮点数,不论你的文档是下面的哪一种,
1 |
{“number”:22.13} |
2 |
{“number”:213} |
本质上都是一种类型:64位浮点数
1.6.4 字符串
就是UTF-8字符串类型的数据啦
1 |
{“name”:”CC”} |
1.6.5 符号
又是一个不支持的,会自动转换成字符串。(这个用来干嘛CC也不知道。难道是+-/*?)
1.6.6 对象id
初次接触MongoDB可能对这个感到奇怪,不过看多了你就知道,这个键值在每一个文档中都会存在,并且值都是唯一存在的。所以,简单的来说,这个就是集合里面每个文档的唯一标识。其使用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串(其实可以自己设定其值,但是这样就不能保证唯一性了,所以,一般都是由系统自动增长)。12个字节分别由第 0-3 位时间戳,第4-6位机器码,第7-8位PID和第9-11位计数器组成,每一秒能生成16777216个不同的Objectid。(感觉很厉害的样子)
1.6.7 日期
从纪元开始的毫秒数,一边调用new Date()后返回一个日期的字符串。
1 |
{“ time ”:new Date()} |
1.6.8 正则表达式
文档里面可以包含正则表达式,这个就不多解释了。
1 |
{“testregex”:/erbida/i} |
1.6.9 代码
文档中可以包含JS代码,代码对我们来说就是神器了,你懂的。
1.6.10 二进制数据
又是一个不能用的,由字节串组成。
1.6.11 最大值和最小值
不能用(CC不知道这个最大值最小值是什么意思,这个需要类型么?虽然在后面的$修改器里面有$max和$min,不过应该不是同一类吧)
1.6.12 未定义
这个就是传说中的undefined,他和null在JS中是有区别的
1 |
{“canon”:undefined} |
1.6.13数组
数组很好玩,可以做列表,队列和栈的一些操作,所以每次操作的时候得小心。数组可以包含一组值,类型可以不同,具体的先关操作在$修改器那会讲哟。
1 |
{“ test ”:[“a”,”cc”,2]} |
1.6.14 内嵌文档
内嵌文档我们也叫做子文档,相信熟悉JSON的童鞋一定不会陌生,例如
1 |
{“name”: |
2 |
{ |
3 |
“first”:”Miku”, |
4 |
“last”:”Hatsune” |
5 |
} |
6 |
} |
这个类型是非常常用的哦!
----------------------------------华丽的分割线-----------------------------------------
这一章主要是介绍理论知识,代码不多(CC苦逼的因为雾大堵在高速公路上写的,写完了,刚好通车了)。有很多的不足还请各位大神指教,也请正在学习的童鞋共同讨论下呗。
回到家重新编辑了一下,在Word里面弄了下格式。
编程神马的,要有爱才行!
最后编辑日期:2013年1月11日晚