MongoDB
一、MongoDB的简介
1、NoSql和mongodb
NoSQL ,(Not Only SQL),泛指非关系型数据库, 它是由一次叫“反Sql运动”的社区讨论而诞生的体系。
NoSql的共同特点和优势:
NoSQL 通常是以key-value形式存储的(如:Memcache)
不支持SQL语句,
没有表结构
配置简单
灵活、高效的操作与数据模型
低廉的学习成本
能很好地作为MySql的中间层
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,但是mongdb做不到关系型数据的连表,外键等操作,它的存储数据方式有点类似于Json格式,Mogodb叫做这种格式叫为Bson(big json),Mongodb是一个面向集合的,模式自由的文档型数据库。
MongoDB能很好地支持PHP
MongoDB安全性是所有NOSql最好的.
MongoDB安装的文件比较大,占据了一定的硬盘空间
2、mongodb与 mysql性能比较
下面是官方的bench-mark数据测试数据:
1.分别插入100万条记录,并对其做100个用户并发查询操作,
Mongodb分片(把大数据拆分为小数据进行复制)数据测试结论:138M/s
3、应用范围和限制
缺点:不支持连表查询,不支持sql语句,不支持事务存储过程等,所以不适合存储数据间关系比较复杂的数据,一般主要是当做一个数据仓库来使用。
适用于:日志系统,股票数据等。
不使用于:电子商务系统等需要连多表查询的功能。
国内职场中应用mongodb最广泛的网站(PHP+Mongodb):
youku(优酷)
tudou(土豆)
星期五台球网(在广州,北京,上海,南京,台湾,澳门,香港,美国,芬兰,英国,澳大利亚都有分公司,这个公司的总部在新加坡)
这是一个综合性的网站集直播,电子商务,明星代言,赛事组织,赌博娱乐,门票买卖和台球赛事资讯于一体,是全球最大的台球体育赛事直播网站,我国著名斯诺克选手丁俊晖和香港著名选手傅家俊也曾经是该公司的代言人.因此它是一个具有雄厚资金的实力的1个公司.它的分公司香港和澳门比较缺乏PHP的技术人才,尤其是澳门那边一般是招聘国内这边的技术人才,待遇很高,一个初级的PHP工程师澳门分站开出的薪资是28000元奥币(22400RMB).税后也能够有18000元,且有员工的公寓,办公地点在悦榕庄大酒店(6星级)的技术开发部,包三餐且有员工宿舍(在珠海).正常是早上9点30分上班,晚上18点下班,但赛事直播期间需要凌晨上班配置公司的直播主持人相关设定和活动的开启,这点比较辛苦.该公司的业务目前还与MMA和UFC官方合作,在不久的将来将在澳门和香港开切搏击赛事的直播频道,据说会在今年12月上线,MMA和UFC是全球观众仅此与足球和NBA的赛事.
该公司拥有2种开发架构:ASP.NET + SQL 和 PHP + MongoDB
二、需要掌握的几个概念
1、文档
文档是mongoDB中数据的基本单元,类似关系数据库的行,
多个键值对有序地放置在一起便是文档。
MongoDB 中以文档的方式存取记录,如一条记录格式如下:
{ “username”:”Tom”, “age”:10 ,email:’xiaobai@sohu.com’,’sex’:男}
{ "username":"Tom" , "age" : "10" }
{“Username”:”Tom”,”age”:10}
{“Username”:”Tom” }
注意:
(1)以上是几个不同的文档,MongoDB区分大小写的数据类型,第一个age字段是数字类型,第二个age是字符串类型。
(2)每一个文档最大字节大小是16M (MySql1行记录最大字节大小也是16M)
2、集合(表)
集合就是一组文档,多个文档组成一个集合,集合类似于 mysql里面的表 。
无模式是指,在同一个集合中可以包含不同格式的文档,如:
{ "Name" : "Mongodb" , "Type" : "Nosql" }
{ "UserName" : "Tom" , "age" : 20 , "Gender" : "male" }
以上两个文档可以放在同一个集合中。
在Mysql需要先建表再插入数据,
模式自由(schema-free):意思是集合里面没有行和列的概念,
注意:MongoDB中的集合不用创建、没有结构,所以可以放不同格式的文档。
3、数据库
多个集合可以组成数据库。一个mongoDB实例可以承载多个数据库,他们之间完全独立。
Mongodb中的数据库和Mysql中的数据库概念类似,只是无需创建。
一个数据库中可以有多个集合。
一个集合中可以有多个文档。
4、mongodb的数据体系
三、安装mongodb
第1步:通过yum search mongodb,查到mongodb的安装包如下:
第2步:输入yum -y install mongodb mongodb-server进行安装(下载完成大概有123M)
安装成功会出现以下界面:
第3步:启动mongodb,命令:service mongod start
第4步:使用命令mongo就可以进入mongodb数据库的客户端
mongodb的经典版本是2.4,最新版本是2.7,一般建议使用mongodb2.4
注意:如果希望卸载一个软件可以使用yum -y remove mongodb*
四、入门语句
1、创建数据库和切换数据库
语法规则:use [数据库名称]
比如:创建或者切换一个数据库名为php25
注意:如果该数据库不存在,则创建,如果该数据库存在,则是切换,如果创建了数据库,没有任何的操作,则会自动删除该数据库。
2、获取当前数据库名称
语法规则:db
比如:显示当前正在使用的数据库名称
3、查看当前数据库状态
语法规则: db.stats()
比如:如果您当前ues了一个名为php25的数据库,那么db就表示为php25,stats就可以查看当前数据库的状态
4、查看所有的数据库
语法规则:show dbs
比如:查看数据在mongodb里面已经创建的数据库
空数据库会被mongdb自动回收
5、创建集合(表)
语法规则:db.集合名.insert({key:value....})
比如:向php25数据库中创建一个集合(表),创建集合必须添加一个文档,创建集合名称为class1,集合中的文档(记录)为name=pengjim,age=30
使用命令: db.class1.insert({name:'pengjim',age:30});
注意:mongodb里面的集合是隐式创建,就是无需创建,直接使用,回车不提示任何的错误,那么就代表该集合创建成功.
6、查看集合(表)
语法规则:show tables
比如:显示当前操作的数据库中的所有集合
system.indexs是用来存放当前数据相关索引信息集合。
7、查询集合里面的文档
语法规则:db.集合名.find()
比如:查找一个集合中的所有数据,其实就相当于mysql数据库中使用select * 查找表中所有的数据.
使用命令: db.class1.find()
objectId是mongodb默认产生主键,objectId产生的主键字节数很大,一般占据了16个字节,因此不利于mongodb的数据库文件的大小和空间节约,一般我们会把这个Object修改为int类型进行存储,所以主键是可以自定义的,自定义的名称一定为_id,比如:要插入一条主键为100的文档,那么代码如下图所示:
注意:如果一个_id已经存在,继续插入重复的_id那么Mongodb就会报错,效果如下:
插入相同的主键就会报错:
因此跟Mysql一样Mongodb的主键也是某一个文档(记录)唯一性标识
db.集合名.findOne()查询第一个文档(现实开发中这个命令我很讨厌)
注意:findOne永远只会查询集合中的第一个文档(记录)[不常用],且它的很多功能是没有的,后面遇到再提及一下
8、删除集合(表)
语法规则:db.集合名.drop()
比如:删除一个数据库中的集合,好比删除mysql中的一张表
如果返回true代表删除成功,而且删除一个集合会把该集合里面所有文档都删除了
9、删除数据库
语法规则:db.dropDatabase()
比如:删除一个已经存在的数据库,db与您当前use的数据库相关,如果你use了php25这个数据库,那么db.dropDatabase()删除的就是php25这个数据库
如果使用db.dropdatabase()删除的结果如下:
10、帮助命令
①语法规则:db.help()
db.help()是获取当前数据库相关的帮助命令
比如可以看到以下我们试用过的命令:
③语法:db.集合名.help()
获取当前数据库中某一指定集合的相关帮助命令
比如可以看到以下我们试用过的命令:
还可以尝试一下一些我们没有用过命令:
44是代表集合stu的字节数据大小
五、聚合更新操作
1、插入数据且修改objectId数据类型
语法规则: db.集合名.insert({key:value})
在添加的文档里面,都有一个_id的键,值为对象类型。
ObjectId类型: 每个文档都有一个_id字段,同一集合中的_id值唯一,该字段可
以是整数的数据,默认是一个ObjectId对象。
ObjectId对象数据组成:时间戳 |机器码|PID|计数器
_id的键值我们可以自己输入,但是不能重复
注意:在插入数据的时候,如果_id的值重复则会报错。
插入一个叫做风清扬(fengqingyang)的用户,id=999,如下:
如果_Id重复了,那么就算其他字段信息是不一样的数据记录照样提示失败
2、批量插入数据且修改_id为整型
在MongoDB当中,MongoDB支持JS的循环方式,如果希望批量插入,可以使用以下方法:
这时我们想知道上述批量操作是否成功,使用命令:db.class1.find()去查看
效果如下:
如果我们想知道当前集合class1中有多少个文档,那么可以通过help发觉到count()命令,进行尝试就会得到一下结果:
3、删除文档(删除记录)
语法:db.集合名.remove({条件})
注意:一般删除需要加上条件进行删除,如果不加条件就是删除全部,相当于mysql当中的delete from 表名不加where条件,这样的话,有可能会进行误删除
例1:删除class1集合学号为5的文档
使用命令: db.class1.remove({num:5});
例2:删除 class1集合_id小于3的文档
如果需要满足例子2的需求,则需要使用操作符来完成
常用操作符:
$lt(小于<) , $lte(小于等于<=) , $gt(大于>) , $gte(大于等于>=)
less than简写为:lt,小于的意思
less than equls 简写为:lte ,小于等于的意思
great than 简写为:gt,大于的意思
great than equls:简写为:gte,大于等于的意思
使用操作符的条件规则:db.class1.remove( {字段名:{'操作符':值}} );
记住口诀:
操作符在字段之内,修改器在字段之外,遇到{}和[]用数组来代替,遇到.用->来代替
例3:删除 class1集合_id小于或等于4的文档
4、编辑(修改)文档
在mongodb中更新文档主要依赖于修改器,常用的有两种$set修改器和$inc修改器
①$set修改器语法:db.集合名.update({条件},{'$set':{修改的键:修改的新值}})
比如:把stu10(_id=10)的名字改为林志玲
执行结果如下:
如果我们需要为_id=10的这个学生加上一个年龄的字段(age),我们应该如何操作呢?同样使用$set修改器,$set修改如果修改一个已经存在的字段那么就编辑的行为,如果修改一个不存在的字段,那么就是添加字段的行为:
执行结果如下:
②$inc修改器语法:db.集合名.update({条件},{'$inc':{修改的键:修改的新值}})
$inc修改一般大多数情况下是拿来对整型进行加操作[加+,减-]
比如:对林志玲加3岁就可以使用$inc修改
执行结果如下:
注意:语法的操作,操作成功是为林志玲加3岁
比如:对林志玲做减去2岁也可以使用$inc修改
执行结果如下:
注意:语法的操作,负数就是减操作,对林志玲做减去2岁
5.批量修改
在mongodb当中,mongodb很特殊,它只能每一次修改一条记录,如果修改的时候有多条记录符修改的条件,它也只会默认修改最前面的一条,效果如下图所示:
例子1:把_id小于或者等于10的学生的学科都改为laravel,代码如下所示:
发觉以上的代码无法完成我们的需求,这时,我们需求使用以下格式进行批量更新
批量更新语法规则:
db.demo.update( {条件},{'$set':{字段:值}},更新的默认状态,是否启动批量更新);
说明:
更新的默认状态:如果为true默认更新1条记录,如果有多条记录复合更新的条件那么就更新最前面的一条,默认为true
是否启动批量更新:如果是true代表启动,如果是false就代表不启动,默认false,不启动
如果需要批量更新,固定语法格式如下:
db.demo.update( {条件},{'$set':{字段:值}},false,true);
比如:把_id小于或者等于10的学科全部改为YII
批量更新成功后的结果如下:
六、mongodb的聚合查询文档
语法:db.集合名.find({条件})
如果条件为空相当于写了db.集合名称.find({}),就是查询全部.
案例1:取出class1集合里面第一个文档
语法:db.集合名称.findOne();
注意:如果您确定所查找的记录有且只有一条,那么使用findOne方法的理论上效率会高于find方法,官方建议在查找一条记录时用findOne取代find,但findOne的功能有限的.我一般用limit来代替
查看帮助可以获取limit的语法结构:
个人是建议用limit(1)来代替findOne
使用limit可以获取聚合查询的所有功能,比findOne好用
案例2:取出class1集合里面学号为10的文档
语法规则: db.集合名称.find({条件});
执行结果如下:
案例3:取出class1集合中_id大于或等于6的学生
使用操作符来完成
常用操作符:
$lt(小于) , $lte(小于等于) , $gt(大于) , $gte(大于等于)
less than简写为:lt,小于的意思
less than equls 简写为:lte ,小于等于的意思
great than 简写为:gt,大于的意思
great than equls:简写为:gte,大于等于的意思
语法:db.class1.find({字段名:{操作符:条件}})
假设把需求修改一下:查找_id大于或者等于6的学生,但值读出查找的记录的前面2条,这时需求把代码修改成以下这个结果:
执行结果如下:
案例4:取出class1集合姓名为stu4只显示姓名和学科
语法规则:db.集合名称.find({条件},{字段:1/0});
说明:
{字段:1} : 代表只显示该字段
{字段:0} : 代表不显示该字段,但显示该字段以外的所有的字段
执行结果如下:
注意:您只显示某一字段,但是mongodb默认的主键_id也会跟随一起显示
案例5:根据_id的升序或者降序去显示学生的信息
需求1:按照学生的_id的升序,显示前面的3个学生的文档:
其实默认情况下mongodb就是升序的排列形式,如果想正规使用排序可以参看以下这个升序语法:
语法:db.集合名称.find().sort({字段名:1}).limit(n);
说明:
sort({字段名:1}):1代表按照升序的顺序进行排序
以上语法不省略sort的写法如下:
正规的语法和默认的语法都是一样的结果:
需求2:按照学生的_id的降序排序,显示前面的3个学生的文档:
语法:db.集合名称.find().sort({字段名:-1}).limit(n);
说明:
sort({字段名:-1}):-1代表按照降序的顺序进行排序
正规的语法的结果:
需求3:按照学生的_id的降序排序,每次只显示最后一个文档:
语法:db.集合名称.find().sort({字段名:-1}).limit(1);
执行结果:
如果要查询最后一个文档(记录),如果使用findOne无法实现的,会出现以下的错误结果:
因为findOne是有限的,不能支持很多的功能,因此我们只能使用limit去取代findOne
案例6:显示class1集合中最后1个文档,并且只显示学科和姓名
代码:db.class1.find({},{lesson:1,name:1}).sort({_id:-1}).limit(1);
执行结果如下:
注意:这时虽然我们只是查找一条记录,然而它附加条件有显示某些字段那么这时需要使用find方法来取代findOne
因为findOne是功能有限,如果你希望查最后一条必须使用sort,这时findOne并不能支持sort所以,你只能够用find+limit去代替findOne.
案例7:在class1集合当中显示前面3条记录,这记录必须跳过前面2条进行显示
语法规则:db.集合名称.find().skip(n).limit(n)
以上的命令说明mongodb的数据库一个自由的文档性数据库,所谓自由就是命令可以随意的组合并且可以随意使用命令的顺序,由于它特殊性很强烈,因此有人把这样的命令公式称为聚合命令操作.
案例8:统计class2集合中文档的个数
db.集合名.count():返回集合中有多少个文档。
需求:要跳过前面的2条记录,查询跳过记录后的总数是多少
代码: db.stu.find().skip(2).count();
执行结果如下:
这样的原因是为什么呢?
发觉如果使用上述的代码无法完成当前的需要,原因是mongodb没有把skip当成一个条件来的对待,如果希望mongodb把skip当成条件来对待,那么就需要把count设置true
代码的改进如下:
代码: db.stu.find().skip(2).count(true);
执行结果已愿景一样:
既然mongodb支持聚合查询,那么如果我们把count(true)放在skip之前可以吗?
发觉结果会报错
因为count(true)只能够往前看,而不能往后看
$or操作符
or操作符就相当于mysql中的or操作,是一个或布尔操作
语法:db.集合名称.find({ ‘$or’:[{字段:条件},{字段:条件}....] });
例子1:查找class2当中_id=11或者name=stu17的学生记录
执行的结果如下:
例子2:查找class2当中_id=12或者num=14或者name=18的学生记录,并且只显示姓名和学科
执行的结果如下:
$and操作符
and操作符就相当于mysql中的and操作,是一个与布尔操作
语法:db.集合名称.find({'$and':[{字段:条件},{字段:条件}....] });
例子1:查找class2中_id=10并且num=10的学生信息
例子2:查找class2中_id=7并且num=7并且name=stu7的学生信息,只现实姓名和id
执行结果如下:
$in操作符
语法规则:db.集合名称.find({字段名:{'$in':[in的条件]}});
例子:查找class2集合中_id分别为11,14,15,17,18的学生信息
七、Mongodb的权限机制
1、权限概述
在默认情况下mongodb默认无需任何授权就会以超级管理员的身份进入任何数据库当中
因此我们必须添加授权验证方式。
注意:在mongodb中添加管理员必须创建一个admin数据库,这个数据库添加的用户数据就是mongodb中的管理员。这个数据库默认的情况其实是存在但有些mongodb的版本是看不见的,这是mongodb开发者故意隐藏起来的。但如果你创建了用户这个数据库就隐藏不了。
2、创建超级管理员用户
第一步: 选择admin数据库(如果是第一次use admin其实是创建了admin数据库 )
第二步:使用命令
如果使用db.help()可以发现有一个方法叫addUser
语法:db.addUser(用户名,密码,是否只读(默认为否))
如果希望创建一个名为root的用户,密码为123456,那么代码如下:
执行结果如下所示:
第三步:如果希望查看刚才所创建的管理员用户,那么需要到一个叫system.users的集合中查看
查看system.users的结果如下图所示,查看代码为:db.system.users.find();
从上图可以得知,mongodb的管理员密码是加密的,安全性较高(高于redis和memcache很多)
3、为mongodb创建授权登录验证权限
当完成了管理员的创建后,就确保了有一个用户可以统一管理mongodb了,这时我们需要关心的就是mongodb的配置了,配置授权登录验证的方法其实有好几种,我们采用方法是比较常用且比较传统的,步骤如下:
第一步:首先退出当前的mongodb,使用exit命令(快捷键:ctrl+c)
第二步:这时其实你只是退出了登录,但实际上mongodb还是占据着系统的进
使用netstat -tunpl | grep mongod会看到当前的进程占据着27017的端口。
第三步:停止mongodb数据的进程,把端口终止,命令:service mongod stop
有时候在linux当中守护进程会启动其他的辅助进程,如果你使用温柔虐杀的手段是无法将其的辅助进程杀死的,zxapp这个监控进程(思科的一个监听工具),会启动很多辅助进程,如果希望停止监听,必须要使用强制杀死zxappd的方法pkill zxappd,如果使用service zxappd stop则无法杀死它的辅助进程.
第四步:修改mongodb的配置,使用vim /etc/mongodb.conf,使用末行模式搜索/auth,得到的结果如下图所示:
把auth前面的#好去掉,这样就打开了mongodb的授权才能登录的验证,但你必须确保当前是处于mongodb所有进程没有启动的情况下修改了该配置,修改效果如下图所示:
修改完成后,需要保存并退出(:x等同于:wq)
第五步:启动mongodb,使用命令service mongod start
第六步:再次使用netstat -tunpl | grep mongod 查看进程
第七步:这时如果我们不输入用户名和密码就直接进入mongodb当中,你会发觉你做的一些操作会报错,这就说明了,我们的授权配置起了作用
这时我们可以使用exit退出数据,如下图所示
第八步:是登录的使用直接输入用户名和密码,指向admin数据库进行验证
在mongodb当中使用管理员登录的过程叫做权限验证的过程,如果你在admin数据库当中添加了一个管理员,那么权限验证就需要发生在admin数据库中,权限验证的代码如下:
mongo -u账号 -p密码 Mongodb的ip地址(本地使用localhost):端口(27017)/admin
如果不把root和密码放到admin数据库中进行验证,那么无法正常登录,要正常登录必须要验证root和密码在admin数据库中,编写验证命令如下:
mongo -uroot -p123456 localhost:27017/admin
进入之后,就是管理员的身份了,进行一些操作,确认无误即可
5.修改管理员的密码
删除管理员一般现实当中我们很少会这样做,但是如果有一个员工从某一个公司离职之后,我们需要把它拥有的账号屏蔽,那么我可以采用修改密码的方法对其进行屏蔽:
修改密码的方法如下(如果您当前版本是经典的mongdb2.4),那么修改密码的方法就是addUser:【可以新增也可以修改】
如果修改密码成功,则旧密码无法再次进行登录,如下图所示:
尝试使用修改后的密码654321登录,就发觉成功:
如果在真实的开发环境中,要建议公司的老板购买阿里云云存储引擎版的mongodb
八、Mongodb 中索引和执行计划
1、建立普通索引
语法规则:db.集合名称.ensureIndex({字段名:1/-1});
说明:
ensureIndex({字段名:1}):代表创建一个字段为索引,默认的情况为升序索引(常用)
ensureIndex({字段名:-1}):代表创建一个字段为索引,默认的情况为降序索引(少用)
因为mongodb的索引结构分为升序和降序两种物理排序法,我们只需知道就可以了,不需要去理会
例子1:为num字段进行普通索引的建立:
不出现任何的错误,就代表创建索引成功,可以通过db.class2.getIndexes()去查看当前数据库class2集合中的所有索引,效果如下:
2、唯一性索引
在mongodb当中唯一索引,通常是用来做唯一性约束用的。
语法:
db.集合名.ensureIndex({name:1},{unique:true})
需求:对name字段做唯一性索引进行名称的唯一性约束
创建完成,查看索引效果如下:
测试结果如下:
如果建立唯一索引成功,那么就会重复插入失败
如果插入的数据name=stu21,如下:
3、查看索引和执行计划
常用命令:
(1)查看当前索引状态: db.集合名.getIndexes();
(2)详情查看本次查询使用哪个索引和查询数据的状态信息。
需求:查看一个名为mongod的用户,然后使用执行计划explain()方法来观察索引是否有被使用,语法如下:
语法:db.find({条件}).explain();
在没有建立索引的情况下,explain()执行如下:
在有建立索引的情况下,explain()执行如下:
5、删除索引
删除单个索引
db.集合名.dropIndex({字段名:1});
执行结果如下:
删除所有索引,可以使用以下方法
db.集合名.dropIndexes();然而该方法比较危险,因为它会清除整个集合的索引(尽量不要使用该方法)
注意:mongodb跟mysql不同的是,它的索引是没有所谓原则的,因为它是nosql数据库,它索引是否可以被用上可以主观通过explain来查看,一般查询的时候用到的查询条件是索引都可能用的上.就算用不上索引,mongodb因为速度优越其实依然很快,现实开发当中不到过亿条记录都不需要使用mongodb的索引,因为使用索引文件的空间就会变大,但mongodb是速度很快的,因此不需要一开始就付出索引的代价
如果我们在mongodb中使用in查询,那么in语句是否可以使用上索引呢?
例子:查找num为2,4,9,11,17,18的学生信息
九、php操作mongodb的CURD
1、在php中安装mongodb扩展步骤
第一步:通过yum search mongodb可以找到以下结果
第二步:输入以下安装指令,安装php的mongodb扩展
yum install -y --enablerepo=remi --enablerepo=remi-php56 php-pecl-mongo
出现以上界面,代表安装成功,然后重启apache服务器
第三步:在浏览器端,查看mongodb的模块是否安装成功
出现以上界面,代表安装成功,但是如果希望php能够成功链接mongodb必须关闭iptables和selinux,否则不会成功
2、使用php操作mongodb数据库的CURD
(1)连接mongodb服务器,并尝试插入一条数据
代码参看:code/connect.php下,上传到/var/www/html下测试
口诀:遇到{}和[]用数组来代替,遇到.用->来代替
测试结果如下:
简单理解迭代器是一个特殊的数组就可以了,这时我们先带这个这个问题往前,如果返回迭代器,我们也很难判断当前数据的连接是否成功,那么我们可以使用insert插入一条数据来测试,修改代码如下:
测试结果:
如上执行成功,就证明php可以成功连接mongodb数据库
(2)删除mongodb中的数据
代码参看:code/remove.php下,上传到/var/www/html下测试
例子1:删除class3集合中的数据当中你年龄小于33岁的用户
测试结果如下:
出现以上界面,代表连接mongdb,并且删除数据成功
例子2:删除class3集合中的数据当中你年龄33,35的信息
代码参看:code/remove2.php下,上传到/var/www/html下测试
执行结果如下:
(3)修改Mongodb中的数据
代码参考:code/update.php下,上传到/var/www/html下测试
例子1:修改class3当中的数据把name=itcast1修改为name=独孤求败
测试的结果如下:
出现以上界面,代表连接mongdb,并且修改数据成功
例子2:修改class2当中_id小于13的数据的lesson=laravel
执行结果如下所示:
(4)查找mongodb中的数据
①查找class2所有的数据的前5条
该代码文件位于code/find5php下,上传到/var/www/html下测试
由于返回的是一个迭代器,因为我们需要把迭代器转化称为数组形式,应该怎么做呢?
把代码修改如下:
把数组进行遍历输出:
如果不记得这个函数iterator_to_array,那么我们还可以使用foreach来进行转化(php5.5以上才有效),修改代码如下:
执行foreach转化结果如下:
②按条件查找数据,查找学号大于5的学生记录,并且只显示前面4条,而且只显示学科和姓名
该代码文件位于code/findgt.php下,上传到/var/www/html下测试
测试的结果如下:
十.使用php操作$or和$and(拓展)
该代码文件位于code/findor.php下,上传到/var/www/html下测试
例子1:查找_id=17或者num=8或者name=stu6的学生
执行结果如下:
该代码文件位于code/findand.php下,上传到/var/www/html下测试
例子2:查找_id=12并且lesson=laravel的信息
执行结果如下:
十一.mongodb的分片和复制
在mysql当中虽然我们拥有索引或者sphinx进行支持,然而mysql是有瓶颈的,并且我们mongodb是比较接近mysql,所以有时在开发当中,我们就可以把mongodb当成一个数据仓库来进行对待,把一些大的数据复制到mongodb当中让mongodb进行读取
在默认的情况下,mongodb如果没有设置,那么默认分片的大小为16M,但是mongodb能够1秒钟分片的数据容量为138M,因此我们可以调整分片的数据大小.
对monogodb进行分片是非常简单,只需要手动在/etc/目录下创建一个名为mongodb.sharding的文件,并写入以下内容即可:
保存并退出(:x),重启mongod服务
如果没有报错,就证明分片的配置生效了,完成了分片设置,我们就可以把Mysql数据复制到Mongodb当中,编写代码如下:
该代码文件位于code/copy.php下,上传到/var/www/html下测试
该代码文件位于code/readFromMysql.php下,上传到/var/www/html下测试
//用foreach转化迭代器为数组
这时假设我们在mysql数据中添加一条数据,为南京传智播客中心
但是这时在浏览器访问readFromMysql.php发觉没有添加的数据.我们需要更行copy.php才可以获取最新的数据,因此我们需要使用crontab -e命令添加如下定时器代码:
第1步:使用whereis php命令找到php命令执行目录
第2步:使用crontab -e命令在vim的编辑模式下添加定时器如下:
我们设置了mongodb一分钟拆分数据能力为80M,索引可以大胆使用