PHP操作Mongodb封装类完整实例
本文实例讲述了PHP操作Mongodb封装类。分享给大家供大家参考,具体如下:
getMongo()得到原生的对象,更多API请自行查阅MongoPHP手册,后续版本将会对增加更多的原生API封装
*3:该类所有API接口中的$query查询参数的使用请以下有关[查询条件说明文档]
*4:如果要存储中文字符,则一定要使用utf8的编码.
*5:有了本类接口基本可以按关系型数据库的概念完成Mongodb的大部分开发操作。
*
*[查询条件说明文档]
*
*参数:array('id'=>1)
*等同:whereid=1
*
*参数:array('id'=>1,'num'=>10)
*等同:whereid=1andnum=10
*
*参数:array('id'=>array($mongo->cmd('>')=>5))
*等同:whereid>5
*
*参数:array('id'=>array($mongo->cmd('!=')=>5))
*等同:whereid!=5
*
*参数:array('id'=>array($mongo->cmd('>')=>5,$mongo->cmd('<')=>10))
*等同:whereid>5andid<10
*
*参数:array('id'=>array($mongo->cmd('in')=>array(2,5,6)))
*等同:whereidin(2,5,6)
*
*参数:array('id'=>array($mongo->cmd('%')=>array(2,1)))
*等同:whereid%2=1
*
*参数:array($mongo->cmd('or')=>array(array('id'=>array($mongo->cmd('>')=>5)),array('id'=>array($mongo->cmd('<')=>10))))
*等同:whereid>5orid<10
*
*参数:array('username'=>newmongoRegex("/yhp.*/"))
*等同whereusernamelike"%yhp%"
**/
classLibrary_Mongodb{
/**
*Mongodb对象句柄
*
*@varobjectMongo
*/
private$_mongo=null;
/**
*当前选择的数据库
*
*@varobjectMongoDB
*/
private$_db=null;
/**
*修改器命令前缀
*
*@varstring
*/
private$_cmd='$';
/**
*调试模式TRUE打开FALSE关闭
*@varboolean
*/
constDEBUG=TRUE;
/**
*查询条件映射关系
*
*@vararray
*/
private$_condMap=array(
'<'=>'lt',//id>1
'<='=>'lte',//id<=10
'>'=>'gt',//id>5
'>='=>'gte',//id>=4
'!='=>'ne',//id!=4
'%'=>'mod',//id%4=0
'in'=>'in',//idin(1,2,3,4)
'notin'=>'nin',//idnotin(1,2,3,4)
'or'=>'or',//id=1orid=2
'not'=>'not',//!(id=1)
);
/**
*构造函数
*
*@paramarray$config服务器配置,默认为:
*array(
*'host'=>'localhost',//主机名或IP地址
*'port'=>27017,//端口
*'cmd'=>'$',//修改器命令前缀
*)
*/
publicfunction__construct($config=array('host'=>'xxx','port'=>27017,'username'=>'xxx','password'=>'xxx','db'=>'xxx','cmd'=>'$')){
$server=sprintf("mongodb://%s:%s@%s:%s/%s",$config['username'],$config['password'],$config['host'],$config['port'],$config['db']);
//echo"connect\n";
try{
$this->_mongo=newMongoClient($server,array('connect'=>true));//立即连接
}catch(MongoConnectionException$e){
if(self::DEBUG){
echo$e->getMessage();
}
returnfalse;
}
$this->selectDB($config['db']);
//命令前缀
if(!isset($config['cmd'])){
$this->_cmd=ini_get('mongo.cmd');
if($this->_cmd==''){
$this->_cmd='$';
}
}
}
/*====================================基本操作接口API=================================*/
/**
*向集合(表)中插入新文档
*
*说明:
*1:类似mysql中的:insertinto$colNamesetid=1,name='name1';
*
*@paramstring$colName集合名
*@paramarray$sets数据,如:array('id'=>1,'name'=>'name1')
*@paramboolean$safe是否安全操作false:不等待服务器的响应直接返回true:等待服务器的响应(数据非常重要时推荐)
*@paramboolean$fsync操作后是否立即更新到碰盘,默认情况下由服务器决定
*
*@returnboolean
*/
publicfunctioninsert($colName,$sets,$safe=false,$fsync=false){
$col=$this->_getCol($colName);
try{
$col->insert($sets,array('w'=>$safe,'fsync'=>$fsync));
returntrue;
}catch(MongoCursorException$e){
returnfalse;
}
}
/**
*保存文档
*
*说明:
*1:如果$sets中有字段"_id"的话,则更新对应的文档;否则插入新文档
*
*@paramstring$colName集合名
*@paramarray$sets数据,如:array('id'=>1,'name'=>'name1')
*@paramboolean$safe是否安全操作false:不等待服务器的响应直接返回true:等待服务器的响应(数据非常重要时推荐)
*@paramboolean$fsync操作后是否立即更新到碰盘,默认情况下由服务器决定
*
*@returnboolean
*/
publicfunctionsave($colName,$sets,$safe=false,$fsync=false){
//处理'_id'字段
$sets=$this->_parseId($sets);
$ret=$this->_getCol($colName)->save($sets,array('w'=>$safe,'fsync'=>$fsync));
return$ret;
}
/**
*删除集合中的文档记录
*
*说明:
*1:类似mysql中的:deletefrom$colNamewhereid=1;
*
*@paramstring$colName集合名
*@paramarray$query查询条件,如果为空数组的话,则会删除所有记录.具体请看[查询条件说明文档]
*@paramboolean$delAll是否删除所以条例查询的记录,默认为true,当为false是,类似效果deletefromtabwhereid=1limit1;
*@paramboolean$safe是否安全操作false:不等待服务器的响应直接返回true:等待服务器的响应(数据非常重要时推荐)
*@paramboolean$fsync操作后是否立即更新到碰盘,默认情况下由服务器决定
*
*@returnboolean
*/
publicfunctiondelete($colName,$query=array(),$delAll=true,$safe=false,$fsync=false){
//自动处理'_id'字段
$query=$this->_parseId($query);
//删除选项
$options=array(
'justOne'=>!$delAll,
'w'=>$safe,
'fsync'=>$fsync,
);
$col=$this->_getCol($colName);
return$col->remove($query,$options);
}
/**
*删除整个集合
*
*说明:
*1:集合中的索引也会被删除
*
*@paramstring$colName集合名
*
*@returnarray
*/
publicfunctiondropCol($colName){
return$this->_getCol($colName)->drop();
}
/**
*更新集合文档记录
*
*说明:
*1:类似mysql中的:update$colNamesetname='mongo'whereid=10;
*
*@paramstring$colName集合名
*@paramarray$newDoc要更新的文档记录
*@paramarray$query查询条件,如果为空数组则更新所有记录.具体请看[查询条件说明文档]
*@paramstring$option操作选项,可选择项如下;
*
*'set':只修改指定的字段(默认值,如果这个键不存在,则创建它。存在则更新).
*示例:update('user',array('name'=>'mongo'),array('id'=>10));
*类似:updateusersetname='mongo'whereid=10;
*
*'inc':将指定的字段累加/减(如果值为负数则是相减,不存在键则创建。字段类型一定要是数字)
*示例:update('user',array('num'=>1),array('id'=>10),'inc');
*类似:updateusersetnum=num+1whereid=10;
*
*'push':将文档添加到指定键中(数组),如果键不存在则会自动创建,存在则添加到该键的尾端。
*示例:update('user',array('comm'=>array('commid'=>1,'title'=>'title1')),array('id'=>1),'push');
*解说:为id=1的记录添加一个comm的评论字段,该字段对应一个array('commid'=>1,'title'=>'title1')的新文档。
*
*'pop':将指定键中的文档删除(数组)
*示例:update('user',array('comm'=>array('commid'=>1)),array('id'=>1),'pop');
*解说:删除id=1的记录中comm对应的文档集合中'commid'=>1对应的文档.
*
*'unset':在文档中删除指定的键
*示例:update('user',array('name'=>1),array('id'=>1),'unset');
*解说:将user集合中将id=1对应的文档中的name字段删除
*
*'pull':删除文档中匹配其值的键
*示例:update('user',array('name'=>'youname'),array('id'=>1),'pull');
*解说:将user集合中将id=1对应的文档中的name='youname'的字段删除
*
*'addToSet':如果值不存在就添加(避免重复添加)
*示例:update('user',array('names'=>'youname'),array('id'=>1),'addToSet');
*解说:向user集合中id=1对应的文档中的names字段添加'youname'这个值(不存在时才添加)
*
*'replace':用$newDoc新文档替换$query所找到的文档
*示例:update('user',array('newid'=>1,'newnames'=>'name1'),array('id'=>1),'replace');
*解说:将user集合中id=1对应的文档用array('newid'=>1,'newnames'=>'name1')的新文档替换
*
*@paramboolean$upAll是否更新找到的所有记录
*@paramboolean$upsert如果查询条件不存在时,是否以查询条件和要更新的字段一起新建一个集合
*@paramboolean$safe是否安全删除false:不等待服务器的响应直接返回true:等待服务器的响应(数据非常重要时推荐)
*@paramboolean$fsync操作后是否立即更新到碰盘,默认情况下由服务器决定
*
*@returnboolean
*/
publicfunctionupdate($colName,$newDoc,$query=array(),$option='set',$upAll=true,$upsert=false,$safe=false,$fsync=false){
//自动处理'_id'字段
$query=$this->_parseId($query);
//得到集合
$col=$this->_getCol($colName);
//重新组合新文档
if($option!='replace'){
$newDoc=array($this->cmd($option)=>$newDoc);
}
//更新条件
$options=array(
'upsert'=>$upsert,
'multiple'=>$upAll,
'w'=>$safe,
'fsync'=>$fsync,
);
return$col->update($query,$newDoc,$options);
}
/**
*查询文档集,返回二维数组
*
*说明:
*1:类似mysql中的select*fromtable
*
*示例:select('user');
*类似:select*fromuser;
*
*示例:select('user',array('id','name'));
*类似:selectid,namefromuser;
*
*示例:select('user',array('id','name'),array('id'=>1));
*类似:selectid,namefromuserwhereid=1;
*
*示例:select('user',array('id','name'),array('id'=>1),array('num'=>1));
*类似:selectid,namefromuserwhereid=1orderbynumasc;
*
*示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),10);
*类似:selectid,namefromuserwhereid=1orderbynumasclimit10;
*
*示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),10,2);
*类似:selectid,namefromuserwhereid=1orderbynumasclimit2,10;
*
*
*
*@paramstring$colName集合名
*@paramarray$query查询条件,具体请看[查询条件说明文档]
*@paramarray$fields结果集返回的字段,array():表示返回所有字段array('id','name'):表示只返回字段"id,name"
*@paramarray$sort排序字段,array('id'=>1):表示按id字段升序array('id'=>-1):表示按id字段降序array('id'=>1,'age'=>-1):表示按id升序后再按age降序
*@paramint$limit取多少条记录
*@paramint$skip跳过多少条(从多少条开始)
*
*@returnarray
*/
publicfunctionselect($colName,$query=array(),$fields=array(),$sort=array(),$limit=0,$skip=0){
//得到集合
$col=$this->_getCol($colName);
//自动处理'_id'字段
$query=$this->_parseId($query);
//结果集偏历
$cursor=$col->find($query,$fields);
//排序
if($sort){
$cursor->sort($sort);
}
//跳过记录数
if($skip>0){
$cursor->skip($skip);
}
//取多少行记录
if($limit>0){
$cursor->limit($limit);
}
$result=array();
foreach($cursoras$row){
$result[]=$this->_parseArr($row);
}
return$result;
}
/**
*统计文档记录数
*
*@paramstring$colName集合名
*@paramarray$query查询条件,具体请看[查询条件说明文档]
*@paramint$limit取多少条记录
*@paramint$skip跳过多少条
*@returnunknown
*/
publicfunctioncount($colName,$query=array(),$limit=0,$skip=0){
return$this->_getCol($colName)->count($query,$limit,$skip);
}
/**
*返回集合中的一条记录(一维数组)
*
*@paramstring$colName集合名
*@paramarray$query查询条件,具体请看[查询条件说明文档]
*@paramarray$fields结果集返回的字段,array():表示返回所有字段array('id','name'):表示只返回字段"id,name"
*
*@returnarray
*/
publicfunctionfetchRow($colName,$query=array(),$fields=array()){
//得到集合名
$col=$this->_getCol($colName);
//自动处理'_id'字段
$query=$this->_parseId($query);
//处理结果集
return$this->_parseArr($col->findOne($query,$fields));
}
/**
*返回符合条件的文档中字段的值
*
*@paramstring$colName集合名
*@paramarray$query查询条件,具体请看[查询条件说明文档]
*@paramstring$fields要取其值的字段,默认为"_id"字段,类似mysql中的自增主键
*
*@returnmixed
*/
publicfunctionfetchOne($colName,$query=array(),$fields='_id'){
$ret=$this->fetchRow($colName,$query,array($fields));
returnisset($ret[$fields])?$ret[$fields]:false;
}
/**
*返回查询文档集合集中指定字段的值(一维数组)
*
*@paramstring$colName集合名
*@paramarray$query查询条件,具体请看[查询条件说明文档]
*@paramstring$fields要取其值的字段,默认为"_id"字段,类似mysql中的自增主键
*
*@returnarray
*/
publicfunctionfetchCol($colName,$query=array(),$fields='_id'){
$result=array();
$list=$this->select($colName,$query,array($fields));
foreach($listas$row){
$result[]=$row[$fields];
}
return$result;
}
/**
*返回指定下标的查询文档集合(二维数组)
*
*@paramstring$colName集合名
*@paramarray$query查询条件,具体请看[查询条件说明文档]
*@paramstring$fields要取其值的字段,默认为"_id"字段,类似mysql中的自增主键
*
*@returnarray
*/
publicfunctionfetchAssoc($colName,$query=array(),$fields='_id'){
$result=array();
$list=$this->select($colName,$query);
foreach($listas$row){
$key=$row[$fields];
$result[][$key]=$row;
}
return$result;
}
/*====================================辅助操作接口API=================================*/
/**
*返回命令或命令前缀
*
*@paramstring$option命令,如果为空时则返回命令前缀
*
*@returnstring
*/
publicfunctioncmd($option=''){
//只返回命令前缀
if($option==''){
return$this->_cmd;
}
//如果是操作符
if(isset($this->_condMap[$option])){
$option=$this->_condMap[$option];
}
return$this->_cmd.$option;
}
/**
*选择或创建数据库(注意:新创建的数据库如果在关闭连接前没有写入数据将会被自动删除)
*
*@paramstring$dbname数据库名
*/
publicfunctionselectDB($dbname){
$this->_db=$this->_mongo->selectDB($dbname);
}
/**
*得到所有的数据库
*
*@paramboolean$onlyName是否只返回数据库名的数组
*@returnarray
*/
publicfunctionallDB($onlyName=false){
$ary=$this->_mongo->listDBs();
if($onlyName){
$ret=array();
foreach($ary['databases']as$row){
$ret[]=$row['name'];
}
return$ret;
}else{
return$ary;
}
}
/**
*删除数据库
*
*@returnarray
*/
publicfunctiondropDB($dbname){
return$this->_mongo->dropDB($dbname);
}
/**
*关闭连接
*
*/
publicfunctionclose(){
$this->_mongo->close();
}
/**
*得到Mongo原生对象,进行其它更高级的操作,详细请看PHP手册
*
*/
publicfunctiongetMongo(){
return$this->_mongo;
}
/**
*返回最后的错误信息
*
*@returnarray
*/
publicfunctiongetError(){
return$this->_db->lastError();
}
/*=======================以下为私有方法======================*/
//解析数据组中的'_id'字段(如果有的话)
privatefunction_parseId($arr){
if(isset($arr['_id'])){
$arr['_id']=newMongoId($arr['_id']);
}
return$arr;
}
//得到集合对象
privatefunction_getCol($colName){
return$this->_db->selectCollection($colName);
}
//解析数组中的"_id"并且返回
privatefunction_parseArr($arr){
if(!empty($arr)){
$ret=(array)$arr['_id'];
$arr['_id']=$ret['$id'];
}
return$arr;
}
}//EndClass
?>
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP+MongoDB数据库操作技巧大全》、《PHP基于pdo操作数据库技巧总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。