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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。