PHP关于MONGODB的相关操作Word下载.docx
- 文档编号:22395592
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:20.19KB
PHP关于MONGODB的相关操作Word下载.docx
《PHP关于MONGODB的相关操作Word下载.docx》由会员分享,可在线阅读,更多相关《PHP关于MONGODB的相关操作Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
db.shutdownServer();
servershouldbedown...
3.添加用户与权限验证
开启MongoDB客户端;
db.addUser("
ixigua"
"
hi.baidu"
)
db.auth("
查看已存在的用户的命令:
db.system.users.find()
现在,来给另一个数据库virusDB配置一个读写权限的用户
usevirusDB
virus"
passwordForVirus"
配置一个只读权限的用户.(onlysupportedin1.3.2+)
usedb_ixigua
guest"
passwordForReadonly"
true)
更改密码
利用addUser命令来更改一个已存在用户的密码
change_passwordForReadonly"
利用下面的命令可以看到刚才创建的两个用户
删除用户的命令
db.system.users.remove({user:
username})
db.system.users.remove({user:
"
});
小知识:
在admin库里面添加用户是全局的,也就是说在admin中添加用户,在其他库里面也是适用的。
要给MongoDB的服务器端添加权限验证,需要在启动MongoDB的服务的时候添加--auth参数,代码如下:
d:
\mongodb\bin>
mongod--dbpathd:
\mongodb\data--logpathd:
\mongodb\log\mongodb.log--logappend--serviceNameMongoDB--auth--install
alloutputgoingto:
d:
\mongodb\log\mongodb.log
CreatingserviceMongoDB.
Servicecreationsuccessful.
Servicecanbestartedfromthecommandlinevia'
netstart"
MongoDB"
'
.
MongoDB服务正在启动.
MongoDB服务已经启动成功。
在这里我是以服务的方式启动MongoDB服务,第一条命令是安装服务,第二条就是启动服务了。
服务都已经启动了,那就剩下打开客户端了,这个就简单了,看代码:
mongo
MongoDBshellversion:
1.8.2
connectingto:
test
showdbs;
MonOct2421:
54:
13uncaughtexception:
listDatabasesfailed:
{
assertion"
:
"
unauthorizeddb:
adminlocktype:
-1client:
127.0.0.1"
assertionCode"
10057,
errmsg"
dbassertionfailure"
ok"
0
}
看到了吧,showdbs命令报异常了,再看异常的具体信息,unauthorizeddb:
adminlock,权限验证不通过啊!
那好,下面就进行权限验证,这里唠叨一下,在进行权限验证的时候,先退出客户端,或者另起一个客户端,代码如下:
mongoadmin-ujiangzhichao-pjzc19880316
admin
admin
0.078125GB
local
(empty)
test
命令格式:
mongo[数据库名]-u[用户名]-p[密码]
上面的showdbs可以执行并看到结果了。
到此,权限验证的过程就算完成了。
4.MongoDB的备份和修复
mongoDB将所有的数据存储在数据目录,缺省为/data/db,那么我们就可以将所有数据目录下的文件拷贝出来来创建备份。
对于运行中的mongoDB来说,拷贝文件的方式创建备份并不安全,这样的备份有可能有损坏,需要修复,除非服务器完成了一个完整的fsync并且不允许写。
关闭服务器然后拷贝数据目录是一种安全有效的方式,但是并不理想。
我们下边看几种技术,可以在不关闭服务器的情况下进行备份。
mongodump和mongorestore
mongodump是mongoDB分发包里的一个工具,它是这样工作的,它对运行中的mongoDB服务器进行查询,然后将所有的数据写入到磁盘。
由于mongodump只是一个普通的客户端,所以它可以对活动状态的服务器进行备份,即使服务其器在处理其他请求或者在执行写操作。
Note:
由于mongodump执行的是普通的查询,所以这个备份不一定就是服务器数据在某个时间点上的快照。
另外就是,备份过程中,其他客户都的性能可能会受到影响。
分发包里还包括了一个对应的工具,mongorestore,用来从备份恢复数据。
fsync和Lock
mongodump和mongorestore使我们能在不关闭服务器的情况下进行备份,但是不能获取某个时间点的数据视图。
fsync命令会强制mongoDB服务器清空所有的挂起的写操作,然后,可以指定是否对数据库加锁以阻止其他的写入,直到数据库解锁。
db.runCommand({"
fsync"
1,"
lock"
1});
info"
nowlockedagainstwrites,usedb.$cmd.sys.unlock.findOne()tounlock"
1
此刻,数据目录就代表了我们的数据在这个时间点上的一个数据一致的快照。
由于现在服务器锁定了写操作,我们就可以安全的进行数据备份了。
备份完成后,我们需要执行解锁
db.$cmd.sys.unlock.findOne();
{"
unlockrequested"
}
db.currentOp();
inprog"
[]}
我们运行了currentOp命令来确保锁被释放了。
slave备份
相比上边的备份方式,最灵活的还是从slave服务器上备份。
主从复制(master-slavereplication)是mongoDB里最常用的复制模式,数据会自动从master服务器复制到slave服务器。
slave服务器一直保持一份几乎和master数据库同步的数据。
因为我们不需要依赖slave服务器是否可用或者它的性能,所以上边提到的3种备份方式我们可以随便用。
修复
我们备份数据,以备发生灾难事件后可以恢复数据,但是不幸情况总是存在的,没有数据备份。
当遇到断电或者软件崩溃,机器重启之后,我们不能保证数据没有问题,好在mongoDB内建了修复功能,尝试修复受损的文件。
如果mongoDB不正常关闭,启动服务器备份的时候就会看到一个警告消息
**************
oldlockfile:
/data/db/mongod.lock.probablymeansuncleanshutdown
recommendremovingfileandrunning--repair
see:
http:
//dochub.mongodb.org/core/repairformoreinformation
*************
修复所有数据最简单的办法就是启动时加上--repaire。
修复的过程很容易理解,首先,数据库里所有的document除了那些无效数据都会被导出,然后立刻导入,这个过程结束后再重建所有的索引。
理解了这个机制,就可以解释修复的某些特性。
大数据集的修复可能会花很长时间,因为所有的数据都是验证过的而且所有的索引都会重建。
修复同时还可能是数据库里的document减少,因为那些损坏的document被抛弃了。
修复的过程同时会执行压缩,额外的空闲空间会被回收。
修复单个的数据库可以在shell里运行repaireDatabase方法
usetest
switchedtodbtest
db.repairDatabase()
1}
修复是清楚损坏的最后手段,最有效的方式仍然是安全地停止服务器,使用replication进行错误恢复,进行常规备份。
Note:
fsync命令会强制mongoDB服务器清空所有的挂起的写操作,然后,可以指定是否对数据库加锁以阻止其他的写入,直到数据库解锁。
5.PHP与MONGODB的常规操作
PHP调用相关用户连接:
$mongo=
newMongo("
mongodb:
//username:
password@192.168.1.22:
12345"
);
Mongo类中有用的一些方法:
Mongo:
:
listDBs()
返回一个包含当前mongo服务上的库(DB)信息的数组。
$mo=newMongo();
$dbs=$mo->
listDBs();
//获得一个包含db信息的数组
selectCollection($db,$coll)
返回一个当前连接下的某db中的collection对象。
$coll=$mo->
selectCollection(’db’,'
mycoll’);
//得到一个collection对象
选择想要的数据库(Mongo类):
一种方式:
$mongo=newMongo();
$db=$mongo->
foo;
//得到一个MongoDB对象
另一种方式:
selectDB(’foo’);
MongoDB中有用的函数:
创建一个MongoDB对象
$db=newMongoDB($mo,’dbname’);
//通过创建方式获得一个MongoDB对象
删除当前DB
$db=$mo->
dbname;
$db->
drop();
获得当前数据库名
_tostring();
选择想要的collection:
A:
dbname->
collname;
//获得一个collection对象
B:
selectDB(’dbname’);
$coll=$db->
C:
selectCollectoin(’collname’);
插入数据(MongoCollection对象):
MongoCollection:
insert(array$a,array$options)
array$a要插入的数组
array$options选项
safe是否返回操作结果信息
fsync是否直接插入到物理硬盘
例程:
db->
$a=array(’a'
=>
’b'
$options=array(’safe’=>
true);
$rs
=$coll->
insert($a,$options);
$rs为一个array型的数组,包含操作信息
删除数据库中的记录(MongoCollection对象):
remove(array$criteria,array$options)
array$criteria
条件
safe是否返回操作结果
fsync是否是直接影响到物理硬盘
justOne是否只影响一条记录
coll;
$c=array(’a'
1,’s’=>
array(’$lt’=>
100));
$rs=$coll->
remove($c,$options);
更新数据库中的记录(MongoCollection对象):
update(array$criceria,array$newobj,array$options)
array$newobj要更新的内容
upsert是否没有匹配数据就添加一条新的
multiple是否影响所有符合条件的记录,默认只影响一条
$newobj=array(’e'
’f'
’x'
’y'
true,’multiple’=>
remove($c,$newobj,$options);
查询collection获得单条记录(MongoCollection类):
arrayMongoCollection:
findOne(array$query,array$fields)
array$query条件
array$fields要获得的字段
$query=array(’s’=>
$fields=array(’a'
true,’b'
findOne($query,$fields);
如果有结果就返回一个array,如果没有结果就返回NULL
查询collection获得多条记录(MongoCollection类):
MongoCursorMongoCollection:
find(array$query,array$fields)
$cursor=$coll->
find($query,$fields);
返回一个游标记录对象MongoCursor。
针对游标对象MongoCursor的操作(MongoCursor类):
循环或的结果记录:
while($cursor->
hasNext()){
$r=$cursor->
getNext();
var_dump($r);
或者
foreache($cursoras$k=>
$v){
var_dump($v);
$array=iterator_to_array($cursor);
整理:
IZPTEC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP 关于 MONGODB 相关 操作