MongoDB初略了解
写在前面
PHP对应的MongoDB等熟悉原生态语言之后,再了解。
1.启动:
安装好了mongoDB之后,并将其加入自动随开机启动后,就可以对MongoDB进行测试并学习了。打开客户端。开始>>运行>>cmd。切换到MongoDB的安装目录,运行mongo.exe,默认是运行在27017端口,然后是MongoDB/data 下进行数据存储。
- C:\Documents and Settings\Administrator>E:
- E:\>CD MongoDB
- E:\MongoDB>mongo.exe
- MongoDB shell version: 2.0.2
- connecting to: test
- >
2.关于MongoDB的几个概念
在学习之前我们就知道MongoDB是NoSql数据库,也就是非关系型数据库,那不存在SQL,也就没有表、行和列了。那它是如何存储呢?是文档存储。那么文档就有几个概念了。
文档>>集合>>数据库
一. 文档是MongoDB中最小单位,也是MongoDB的核心,相当于MySQL数据库表中的一条记录(一行),多个键以及其关联的值有序的放置在一起就是一个文档,所以,文档是采用键值对的形式存放的,采用json格式{ “var1”:"value1","var2":"value2",......} 。
下面就是一个文档:
- {"name":"yangyi"}
- {"name" : "yangyi", " sex": "男" , "age":" 保密", "high" : "182"}
- {"name" : "yangyi" , "sex" : "男"} //文档1
- {"sex": "男" , "name" : "yangyi"} //文档2
- 文档1和文档2顺序不一样,所代表的文档就不一样。
二. 集合就是一组文档,如果说文档类似于Mysql等关系型数据库中的一行(记录),那么集合就相当于关系型数据库中的表了、
集合是无序的,可以存储任意类型(整型,字符型)的文档,集合的命名是非空的字符串,不能包含“$”,不能用"system"开头。
三. 数据库
多个文档组成集合,多个集合就组成了数据库。一个MongoDB实例可以承载多个数据库,他们之间可视为完全独立,每个数据库都有独立的权限控制,那么数据库的命名:
- 不能是空字符串(“”)
- 不能够含有’‘(空格)、. (点) 、$ 、/ 、\ 和 \0(空字符)
- 应全部小写
- 最多64个字节
- admin、local、config都是系统的保留名字,不能作为数据库名。
3.MongoDB的shell
提到shell,,或许并不陌生,这让我想到了linux系统里的shell,就是一组命令编程,通过代码命令,直接在命令提示符下运行,那么在MongoDB中也有shell,它是基于javascript的shell脚本,顾名思义,是可以运行javascript代码的,可以对MongoDB进行系统的管理,检查运行实例,亦或做其他尝试,所以,单纯讲MongoDB,而不与PHP进行连接的话,shell是核心,至关重要。因为对MongoDB数据库的操作都是shell命令。
既然MongoDB是基于javascript的shell脚本的,我们来看看几个javascript代码的运行。
- Microsoft Windows XP [版本 5.1.2600]
- (C) 版权所有 1985-2001 Microsoft Corp.
- C:\Documents and Settings\Administrator>E:
- E:\>CD MongoDB
- E:\MongoDB>mongo.exe
- MongoDB shell version: 2.0.2
- connecting to: test
- > x = 100
- 100
- > x /10
- 10
- >
- E:\MongoDB>mongo.exe
- MongoDB shell version: 2.0.2
- connecting to: test
- > Math.Random();Tue Jan 10 09:20:42 TypeError: Math.Random is not a function (shell):1 //代码会错误提示不是一个函数
- > Math.PI; //javascript里面的PI函数
- 3.141592653589793
- > Math.random();//javascript里面的随机函数
- 0.16819060474183345
- > Math.random();0.8884451417534981
- >
那么,也可以自定义函数,进行操作,和javascript里面一样。
- E:\MongoDB>mongo.exe
- MongoDB shell version: 2.0.2
- connecting to: test
- > function fun1 (n) {
- ... if (n <= 1) return 1;
- ... return n * fun1(n-1);
- ... }
- > fun1(5);
- 120
- >
所以,在MongoDB中对javascript有着非常好的支持。
4.MongoDB的shell对数据库的基本操作
既然MongoDB中的shell脚本如此强大,那么就像是MySQL在命令提示符下,也可以进行对数据库的增删改查操作,MongoDB也不例外。
1 . 创建
在MongoDB中插入一个文档到集合中,也就是插入一行记录到表中是一样的道理。首先是选择数据库,在选择一个集合,最后将一个文档插入。
- E:\MongoDB>mongo.exe
- MongoDB shell version: 2.0.2
- connecting to: test
- > use php //use 库名 ,use用来选择数据库,如果这个php数据库不存在,就创建一个名为php的数据库。
- switched to db php //提示信息
- > post = { //编写一个名为post的文档。
- ... "title":"wowowowo",
- ... "content":"hahahahah",
- ... "time": new Date()}
- {
- "title" : "wowowowo",
- "content" : "hahahahah",
- "time" : ISODate("2012-01-10T03:38:45.515Z")
- }
- >db.blog.insert(post); //像php库中的blog集合中插入post文档。如果blog集合不存在,就自动创建一个新的集合,并将post文档加入到这个集合中去。
在MongoDB中,use database 来选择数据库,当不存在时,就自动创建一个数据库。
db.blog.insert( 文档);来插入一个文档,当然也可以直接插进去,不用post这种形式。
db.blog.find();查找集合里面的全部文档数据;
db.blog.find0ne();查找最近的一个文档。
db.blog.update({条件},内容);更新文档。
db.blog.remove();删除文档。
所以很重要的思想是:先use(选择)库,在选择集合进行的操作,选择集合和对应的操作是一起的。
- E:\MongoDB>mongo.exe
- MongoDB shell version: 2.0.2
- connecting to: test
- > use php //第一步:选择php数据库
- switched to db php
- > post = { //第二步:建一个post文档
- ... "title":"wowowowo",
- ... "content":"hahahahah",
- ... "time": new Date()}
- {
- "title" : "wowowowo",
- "content" : "hahahahah",
- "time" : ISODate("2012-01-10T03:38:45.515Z")
- }
- > db.blog.insert(post); //第三步:选择blog集合(没有就在php库中创建),第四步:插入post文档
- > db.blog.find(); //第五步:查询所有的文档记录
- { "_id" : ObjectId("4f0ba2c1b4787b891f51fb9b"), "title" : "yangyi123", "content"
- : "hahahahahah", "time" : "2011-12-23" }
- { "_id" : ObjectId("4f0bb3375a5904bae2b767a6"), "title" : "wowowowo", "content"
- : "hahahahah", "time" : ISODate("2012-01-10T03:38:45.515Z") }
- > db.blog.findOne(); //第六步:查找最近的一个文档,注意:find0ne()中,0是大写字母。
- {
- "_id" : ObjectId("4f0ba2c1b4787b891f51fb9b"),
- "title" : "yangyi123",
- "content" : "hahahahahah",
- "time" : "2011-12-23"
- }
- > db.blog.find({"title":"yangyi123"}) //第七步:查询,键title为"yangyi123"的文档。
- { "_id" : ObjectId("4f0ba2c1b4787b891f51fb9b"), "title" : "yangyi123", "content"
- : "hahahahahah", "time" : "2011-12-23" }
- > post.comments = "hao a hao a "; //post文档添加一个comments键,值为“hao a hao a ”
- hao a hao a
- > db.blog.update({"title":"wowowowo"},post) //第八步:更新,将title为“wowowo”的文档添加comments键。
- > db.blog.find(); //再重新查看,增加了comments键。
- { "_id" : ObjectId("4f0bc1245a5904bae2b767a8"), "title" : "wowowowo", "content"
- : "hahahahah", "time" : ISODate("2012-01-10T03:38:45.515Z") }
- { "_id" : ObjectId("4f0bc11d5a5904bae2b767a7"), "title" : "wowowowo", "content"
- : "hahahahah", "time" : ISODate("2012-01-10T03:38:45.515Z"), "comments" : "hao a
- hao a " }
- >
- > db.blog.remove({"title":"yangyi123"}) //第九步:删除键title为"yangyi123"的文档。
- > db.blog.remove() //第十步:删除所有的文档
- > db.blog.findOne()
- null
- >