资源描述
PHP操作MONGODB详细文档
1. MONGDB的启动
从命令行启动mongoDB服务器使用可执行文件mongod,mongod有很多的启动选项,运行mongod --help可以查看这些选项,下边是常用的重要选项:
--dbpath 指定数据目录,缺省为/data/db/。每个mongod进程都需要自己的数据目录,如果你要运行3个mongod的实例,那么就需要3个独自的目录。mongod启动的时候会在数据目录创建一个mongod.lock文件,阻止其他进程使用此目录。
--port 指定服务器侦听的端口号。mongod缺省使用27017端口,如果你要运行多个实例,需要给每个进程指定不同的端口。
--fork 创建服务器子进程,以守护进程的方式运行服务。
--logpath 将输出写入指定文件而不是控制台。如果文件不存在,将会创建此文件,如果文件已存在,文件将会被覆盖,旧的内容会被清除掉。如果想保留旧的内容,另外需要使用
–-logappend 设定MONGODB的LOG为追加模式
--config 从配置文件读取启动选项,下边是一个配置文件的示例,#之后的为注释
# Start MongoDB as a daemon on port 5586
port = 5586
fork = true # daemonize it!
logpath = mongodb.log
2. 关闭MONGODB
停止服务器最基本的方式是向进程发送一个SIGINT或SIGTERM信号。如果服务是作为前台进程运行的,那么可以按Ctrl-C,否则可以通过命令如kill来发送信号。
另外一个办法是使用shutdown命令,这个命令必须在admin数据库上运行。
> use admin
switched to db admin
> db.shutdownServer();
server should be down...
3.添加用户与权限验证
开启MongoDB客户端;
> use admin
> db.addUser("ixigua", "hi.baidu")
> db.auth("ixigua", "hi.baidu")
查看已存在的用户的命令:
> db.system.users.find()
现在,来给另一个数据库virusDB 配置一个读写权限的用户
> use virusDB
> db.addUser("virus", "passwordForVirus")
配置一个只读权限的用户. (only supported in 1.3.2+)
> use db_ixigua
> db.addUser("guest", "passwordForReadonly", true)
更改密码
利用 addUser 命令来更改一个已存在用户的密码
> use db_ixigua
> db.addUser("guest", "change_passwordForReadonly", true)
利用下面的命令可以看到刚才创建的两个用户
> db.system.users.find()
删除用户的命令
db.system.users.remove( { user: username } )
> db.system.users.remove( {user:"guest"} );
小知识:在admin库里面添加用户是全局的,也就是说在admin中添加用户,在其他库里面也是适用的。
要给MongoDB的服务器端添加权限验证,需要在启动MongoDB的服务的时候添加--auth参数,代码如下:
d:\mongodb\bin>mongod --dbpath d:\mongodb\data --logpath d:\mongodb\log\mongodb.log --logappend --serviceName MongoDB --auth --install
all output going to: d:\mongodb\log\mongodb.log
Creating service MongoDB.
Service creation successful.
Service can be started from the command line via 'net start "MongoDB"'.
d:\mongodb\bin>net start "MongoDB"
Mongo DB 服务正在启动 .
Mongo DB 服务已经启动成功。
在这里我是以服务的方式启动MongoDB服务,第一条命令是安装服务,第二条就是启动服务了。
服务都已经启动了,那就剩下打开客户端了,这个就简单了,看代码:
d:\mongodb\bin>mongo
MongoDB shell version: 1.8.2
connecting to: test
> show dbs;
Mon Oct 24 21:54:13 uncaught exception: listDatabases failed:{
"assertion" : "unauthorized db:admin lock type:-1 client:127.0.0.1",
"assertionCode" : 10057,
"errmsg" : "db assertion failure",
"ok" : 0
}
看到了吧,show dbs命令报异常了,再看异常的具体信息,unauthorized db:admin lock,权限验证不通过啊!
那好,下面就进行权限验证,这里唠叨一下,在进行权限验证的时候,先退出客户端,或者另起一个客户端,代码如下:
d:\mongodb\bin>mongo admin -u jiangzhichao -p jzc19880316
MongoDB shell version: 1.8.2
connecting to: admin
> show dbs;
admin 0.078125GB
local (empty)
test (empty)
命令格式:mongo [数据库名] -u [用户名] -p [密码]
上面的show dbs可以执行并看到结果了。
到此,权限验证的过程就算完成了。
4.MongoDB的备份和修复
mongoDB将所有的数据存储在数据目录,缺省为/data/db,那么我们就可以将所有数据目录下的文件拷贝出来来创建备份。对于运行中的mongoDB来说,拷贝文件的方式创建备份并不安全,这样的备份有可能有损坏,需要修复,除非服务器完成了一个完整的fsync并且不允许写。关闭服务器然后拷贝数据目录是一种安全有效的方式,但是并不理想。我们下边看几种技术,可以在不关闭服务器的情况下进行备份。
mongodump和mongorestore
mongodump是mongoDB分发包里的一个工具,它是这样工作的,它对运行中的mongoDB服务器进行查询,然后将所有的数据写入到磁盘。由于mongodump只是一个普通的客户端,所以它可以对活动状态的服务器进行备份,即使服务其器在处理其他请求或者在执行写操作。
Note:由于mongodump执行的是普通的查询,所以这个备份不一定就是服务器数据在某个时间点上的快照。另外就是,备份过程中,其他客户都的性能可能会受到影响。
分发包里还包括了一个对应的工具,mongorestore,用来从备份恢复数据。
fsync和Lock
mongodump和mongorestore使我们能在不关闭服务器的情况下进行备份,但是不能获取某个时间点的数据视图。
fsync命令会强制mongoDB服务器清空所有的挂起的写操作,然后,可以指定是否对数据库加锁以阻止其他的写入,直到数据库解锁。
> use admin
switched to db admin
> db.runCommand({"fsync" : 1, "lock" : 1});
{
"info" : "now locked against writes, use db.$cmd.sys.unlock.findOne() to unlock",
"ok" : 1
}
此刻,数据目录就代表了我们的数据在这个时间点上的一个数据一致的快照。由于现在服务器锁定了写操作,我们就可以安全的进行数据备份了。备份完成后,我们需要执行解锁
> db.$cmd.sys.unlock.findOne();
{ "ok" : 1, "info" : "unlock requested" }
> db.currentOp();
{ "inprog" : [ ] }
我们运行了currentOp命令来确保锁被释放了。
slave备份
相比上边的备份方式,最灵活的还是从slave服务器上备份。主从复制(master-slave replication)是mongoDB里最常用的复制模式,数据会自动从master服务器复制到slave服务器。slave服务器一直保持一份几乎和master数据库同步的数据。因为我们不需要依赖slave服务器是否可用或者它的性能,所以上边提到的3种备份方式我们可以随便用。
修复
我们备份数据,以备发生灾难事件后可以恢复数据,但是不幸情况总是存在的,没有数据备份。当遇到断电或者软件崩溃,机器重启之后,我们不能保证数据没有问题,好在mongoDB内建了修复功能,尝试修复受损的文件。如果mongoDB不正常关闭,启动服务器备份的时候就会看到一个警告消息
**************
old lock file: /data/db/mongod.lock. probably means unclean shutdown
recommend removing file and running --repair
see: http://dochub.mongodb.org/core/repair for more information
*************
修复所有数据最简单的办法就是启动时加上--repaire。修复的过程很容易理解,首先,数据库里所有的document除了那些无效数据都会被导出,然后立刻导入,这个过程结束后再重建所有的索引。理解了这个机制,就可以解释修复的某些特性。大数据集的修复可能会花很长时间,因为所有的数据都是验证过的而且所有的索引都会重建。修复同时还可能是数据库里的document减少,因为那些损坏的document被抛弃了。修复的过程同时会执行压缩,额外的空闲空间会被回收。
修复单个的数据库可以在shell里运行repaireDatabase方法
> use test
switched to db test
> db.repairDatabase()
{ "ok" : 1 }
修复是清楚损坏的最后手段,最有效的方式仍然是安全地停止服务器,使用replication进行错误恢复,进行常规备份。
mongoDB将所有的数据存储在数据目录,缺省为/data/db,那么我们就可以将所有数据目录下的文件拷贝出来来创建备份。对于运行中的mongoDB来说,拷贝文件的方式创建备份并不安全,这样的备份有可能有损坏,需要修复,除非服务器完成了一个完整的fsync并且不允许写。关闭服务器然后拷贝数据目录是一种安全有效的方式,但是并不理想。我们下边看几种技术,可以在不关闭服务器的情况下进行备份。
mongodump和mongorestore
mongodump是mongoDB分发包里的一个工具,它是这样工作的,它对运行中的mongoDB服务器进行查询,然后将所有的数据写入到磁盘。由于mongodump只是一个普通的客户端,所以它可以对活动状态的服务器进行备份,即使服务其器在处理其他请求或者在执行写操作。
Note:由于mongodump执行的是普通的查询,所以这个备份不一定就是服务器数据在某个时间点上的快照。另外就是,备份过程中,其他客户都的性能可能会受到影响。
分发包里还包括了一个对应的工具,mongorestore,用来从备份恢复数据。
fsync和Lock
mongodump和mongorestore使我们能在不关闭服务器的情况下进行备份,但是不能获取某个时间点的数据视图。
fsync命令会强制mongoDB服务器清空所有的挂起的写操作,然后,可以指定是否对数据库加锁以阻止其他的写入,直到数据库解锁。
> use admin
switched to db admin
> db.runCommand({"fsync" : 1, "lock" : 1});
{
"info" : "now locked against writes, use db.$cmd.sys.unlock.findOne() to unlock",
"ok" : 1
}
此刻,数据目录就代表了我们的数据在这个时间点上的一个数据一致的快照。由于现在服务器锁定了写操作,我们就可以安全的进行数据备份了。备份完成后,我们需要执行解锁
> db.$cmd.sys.unlock.findOne();
{ "ok" : 1, "info" : "unlock requested" }
> db.currentOp();
{ "inprog" : [ ] }
我们运行了currentOp命令来确保锁被释放了。
slave备份
相比上边的备份方式,最灵活的还是从slave服务器上备份。主从复制(master-slave replication)是mongoDB里最常用的复制模式,数据会自动从master服务器复制到slave服务器。slave服务器一直保持一份几乎和master数据库同步的数据。因为我们不需要依赖slave服务器是否可用或者它的性能,所以上边提到的3种备份方式我们可以随便用。
修复
我们备份数据,以备发生灾难事件后可以恢复数据,但是不幸情况总是存在的,没有数据备份。当遇到断电或者软件崩溃,机器重启之后,我们不能保证数据没有问题,好在mongoDB内建了修复功能,尝试修复受损的文件。如果mongoDB不正常关闭,启动服务器备份的时候就会看到一个警告消息
**************
old lock file: /data/db/mongod.lock. probably means unclean shutdown
recommend removing file and running --repair
see: http://dochub.mongodb.org/core/repair for more information
*************
修复所有数据最简单的办法就是启动时加上--repaire。修复的过程很容易理解,首先,数据库里所有的document除了那些无效数据都会被导出,然后立刻导入,这个过程结束后再重建所有的索引。理解了这个机制,就可以解释修复的某些特性。大数据集的修复可能会花很长时间,因为所有的数据都是验证过的而且所有的索引都会重建。修复同时还可能是数据库里的document减少,因为那些损坏的document被抛弃了。修复的过程同时会执行压缩,额外的空闲空间会被回收。
修复单个的数据库可以在shell里运行repaireDatabase方法
> use test
switched to db test
> db.repairDatabase()
{ "ok" : 1 }
修复是清楚损坏的最后手段,最有效的方式仍然是安全地停止服务器,使用replication进行错误恢复,进行常规备份。
5.PHP与MONGODB的常规操作
PHP调用相关用户连接:
$mongo = new Mongo("mongodb://username:password@192.168.1.22:12345");
Mongo类中有用的一些方法:
Mongo::listDBs()
返回一个包含当前mongo服务上的库(DB)信息的数组。
$mo = new Mongo();
$dbs = $mo->listDBs();//获得一个包含db信息的数组
Mongo::selectCollection($db,$coll)
返回一个当前连接下的某db中的collection对象。
$mo = new Mongo();
$coll = $mo->selectCollection(’db’,'mycoll’);//得到一个collection对象
选择想要的数据库(Mongo类):
一种方式:
$mongo = new Mongo();
$db = $mongo->foo;//得到一个MongoDB对象
另一种方式:
$mongo = new Mongo();
$db = $mongo->selectDB(’foo’);//得到一个MongoDB对象
MongoDB中有用的函数:
创建一个MongoDB对象
$mo = new Mongo();
$db = new MongoDB($mo,’dbname’);//通过创建方式获得一个MongoDB对象
删除当前DB
$db = $mo->dbname;
$db->drop();
获得当前数据库名
$db = $mo->dbname;
$db->_tostring();
选择想要的collection:
A:
$mo = new Mongo();
$coll = $mo->dbname->collname;//获得一个collection对象
B:
$db = $mo->selectDB(’dbname’);
$coll = $db->collname;
C:
$db = $mo->dbname;
$coll = $db->selectCollectoin(’collname’);//获得一个collection对象
插入数据(MongoCollection对象):
MongoCollection::insert(array $a,array $options)
array $a 要插入的数组
array $options 选项
safe 是否返回操作结果信息
fsync 是否直接插入到物理硬盘
例程:
$coll = $mo->db->foo;
$a = array(’a'=>’b');
$options = array(’safe’=>true);
$rs =$coll->insert($a,$options);
$rs为一个array型的数组,包含操作信息
删除数据库中的记录(MongoCollection对象):
MongoCollection::remove(array $criteria,array $options)
array $criteria 条件
array $options 选项
safe 是否返回操作结果
fsync 是否是直接影响到物理硬盘
justOne 是否只影响一条记录
例程:
$coll = $mo->db->coll;
$c = array(’a'=>1,’s’=>array(’$lt’=>100));
$options = array(’safe’=>true);
$rs = $coll->remove($c,$options);
$rs为一个array型的数组,包含操作信息
更新数据库中的记录(MongoCollection对象):
MongoCollection::update(array $criceria,array $newobj,array $options)
array $criteria 条件
array $newobj 要更新的内容
array $options 选项
safe 是否返回操作结果
fsync 是否是直接影响到物理硬盘
upsert 是否没有匹配数据就添加一条新的
multiple 是否影响所有符合条件的记录,默认只影响一条
例程:
$coll = $mo->db->coll;
$c = array(’a'=>1,’s’=>array(’$lt’=>100));
$newobj = array(’e'=>’f',’x'=>’y');
$options = array(’safe’=>true,’multiple’=>true);
$rs = $coll->remove($c,$newobj,$options);
$rs为一个array型的数组,包含操作信息
查询collection获得单条记录(MongoCollection类):
array MongoCollection::findOne(array $query,array $fields)
array $query 条件
array $fields 要获得的字段
例程:
$coll = $mo->db->coll;
$query = array(’s’=>array(’$lt’=>100));
$fields = array(’a'=>true,’b'=>true);
$rs = $coll->findOne($query,$fields);
如果有结果就返回一个array,如果没有结果就返回NULL
查询collection获得多条记录(MongoCollection类):
MongoCursor MongoCollection::find(array $query,array $fields)
array $query 条件
array $fields 要获得的字段
例程:
$coll = $mo->db->coll;
$query = array(’s’=>array(’$lt’=>100));
$fields = array(’a'=>true,’b'=>true);
$cursor = $coll->find($query,$fields);
返回一个游标记录对象MongoCursor。
针对游标对象MongoCursor的操作(MongoCursor类):
循环或的结果记录:
$cursor = $coll->find($query,$fields);
while($cursor->hasNext()){
$r = $cursor->getNext();
var_dump($r);
}
或者
$cursor = $coll->find($query,$fields);
foreache($cursor as $k=>$v){
var_dump($v);
}
或者
$cursor = $coll->find($query,$fields);
$array= iterator_to_array($cursor);
整理:IZPTEC /LIUTAO
2011-11-8
展开阅读全文