php实现的mongodb操作类实例
本文实例讲述了php实现的mongodb操作类。分享给大家供大家参考。具体如下:
<?php
/*
*Tochangethistemplate,chooseTools|Templates
*andopenthetemplateintheeditor.
*/
classmongo_db{
private$config;
private$connection;
private$db;
private$connection_string;
private$host;
private$port;
private$user;
private$pass;
private$dbname;
private$persist;
private$persist_key;
private$selects=array();
private$wheres=array();
private$sorts=array();
private$limit=999999;
private$offset=0;
private$timeout=200;
private$key=0;
/**
*
*CONSTRUCTOR*
*
*AutomaticallycheckiftheMongoPECLextensionhasbeen
installed/enabled.
*Generatetheconnectionstringandestablishaconnection
totheMongoDB.
*/
publicfunction__construct(){
if((IS_NOSQL!=1)){
return;
}
if(!class_exists('Mongo')){
//$this->error("TheMongoDBPECLextensionhasnotbeeninstalledorenabled",500);
}
$configs=wxcity_base::load_config("cache","mongo_db");
$num=count($configs['connect']);
$this->timeout=trim($configs['timeout']);
$keys=wxcity_base::load_config('double');
$this->key=$keys['mongo_db'];
$this->config=$configs['connect'][$this->key];
$status=$this->connect();
if($status==false)
{
for($i=1;$i<$num;$i++)
{
$n=$this->key+$i;
$key=$n>=$num?$n-$num:$n;
$this->config=$configs['connect'][$key];
$status=$this->connect();
if($status!=false)
{
$keys['mongo_db']=$key;
$this->key=$key;
$data="<?php\nreturn".var_export($keys,true).";\n?>";
file_put_contents(WHTY_PATH.'configs/double.php',$data,LOCK_EX);
break;
}
}
}
if($status==false)
{
die('mongoDBnotconnect');
}
}
function__destruct(){
if((IS_NOSQL!=1)){
return;
}
if($this->connection)
{
$this->connection->close();
}
}
/**
*
*CONNECTTOMONGODB*
*
*EstablishaconnectiontoMongoDBusing
theconnectionstringgeneratedin
*theconnection_string()method.
If'mongo_persist_key'wassettotrueinthe
*configfile,establishapersistentconnection.
Weallowforonlythe'persist'
*optiontobesetbecausewewantto
establishaconnectionimmediately.
*/
privatefunctionconnect(){
$this->connection_string();
$options=array('connect'=>true,'timeout'=>$this->timeout);
try{
$this->connection=newMongo($this->connection_string,$options);
$this->db=$this->connection->{$this->dbname};
return($this);
}catch(MongoConnectionException$e){
returnfalse;
}
}
/**
*
*BUILDCONNECTIONSTRING*
*
*Buildtheconnectionstringfromtheconfigfile.
*/
privatefunctionconnection_string(){
$this->host=trim($this->config['hostname']);
$this->port=trim($this->config['port']);
$this->user=trim($this->config['username']);
$this->pass=trim($this->config['password']);
$this->dbname=trim($this->config['database']);
$this->persist=trim($this->config['autoconnect']);
$this->persist_key=trim($this->config['mongo_persist_key']);
$connection_string="mongodb://";
if(emptyempty($this->host)){
$this->error("TheHostmustbesettoconnecttoMongoDB",500);
}if(emptyempty($this->dbname)){
$this->error("TheDatabasemustbesettoconnecttoMongoDB",500);
}if(!emptyempty($this->user)&&!emptyempty($this->pass)){
$connection_string.="{$this->user}:{$this->pass}@";
}if(isset($this->port)&&!emptyempty($this->port)){
$connection_string.="{$this->host}:{$this->port}";
}else{
$connection_string.="{$this->host}";
}$this->connection_string=trim($connection_string);
}
/**
*
*Switch_db*
*
*Switchfromdefaultdatabasetoadifferentdb
*/
publicfunctionswitch_db($database=''){
if(emptyempty($database)){
$this->error("ToswitchMongoDBdatabases,anewdatabasenamemustbespecified",500);
}$this->dbname=$database;
try{
$this->db=$this->connection->{$this->dbname};
return(TRUE);
}catch(Exception$e){
$this->error("UnabletoswitchMongoDatabases:{$e->getMessage()}",500);
}
}
/**
*
*SELECTFIELDS*
*
*DeterminewhichfieldstoincludeORwhichto
excludeduringthequeryprocess.
*Currently,includingandexcludingat
thesametimeisnotavailable,sothe
*$includesarraywilltakeprecedenceover
the$excludesarray.
Ifyouwantto
*onlychoosefieldstoexclude,
leave$includesanemptyarray().
*
*@usage:$this->mongo_db->select(array('foo','bar'))->get('foobar');
*/
publicfunctionselect($includes=array(),$excludes=array()){
if(!is_array($includes)){
$includes=array();
}
if(!is_array($excludes)){
$excludes=array();
}
if(!emptyempty($includes)){
foreach($includesas$col){
$this->selects[$col]=1;
}
}else{
foreach($excludesas$col){
$this->selects[$col]=0;
}
}return($this);
}
/**
*
*WHEREPARAMETERS*
*
*Getthedocumentsbasedonthese
searchparameters.The$wheresarrayshould
*beanassociativearraywiththefield
asthekeyandthevalueasthesearch
*criteria.*
*@usage=$this->mongo_db->where(array('foo'=>'bar'))->get('foobar');
*/
publicfunctionwhere($wheres=array()){
foreach((array)$wheresas$wh=>$val){
$this->wheres[$wh]=$val;
}return($this);
}
/**
*
*WHERE_INPARAMETERS*
*
*Getthedocumentswherethevalue
ofa$fieldisinagiven$inarray().
*
*@usage=$this->mongo_db->where_in('foo',array('bar','zoo','blah'))->get('foobar');
*/
publicfunctionwhere_in($field="",$in=array()){
$this->where_init($field);
$this->wheres[$field]['$in']=$in;
return($this);
}
/**
*
*WHERE_NOT_INPARAMETERS*
*
*Getthedocumentswherethevalueof
a$fieldisnotinagiven$inarray().
*
*@usage=$this->mongo_db->where_not_in('foo',array('bar','zoo','blah'))->get('foobar');
*/
publicfunctionwhere_not_in($field="",$in=array()){
$this->where_init($field);
$this->wheres[$field]['$nin']=$in;
return($this);
}
/**
*
*WHEREGREATERTHANPARAMETERS*
*
*Getthedocumentswherethevalueof
a$fieldisgreaterthan$x
*
*@usage=$this->mongo_db->where_gt('foo',20);
*/
publicfunctionwhere_gt($field="",$x){
$this->where_init($field);
$this->wheres[$field]['$gt']=$x;
return($this);
}
/**
*
*WHEREGREATERTHANOREQUALTOPARAMETERS*
*
*Getthedocumentswherethevalueofa$fieldisgreaterthanorequalto$x
*
*@usage=$this->mongo_db->where_gte('foo',20);
*/
publicfunctionwhere_gte($field="",$x){
$this->where_init($field);
$this->wheres[$field]['$gte']=$x;
return($this);
}
/**
*
*WHERELESSTHANPARAMETERS*
*
*Getthedocumentswherethevalueof
a$fieldislessthan$x
*
*@usage=$this->mongo_db->where_lt('foo',20);
*/
publicfunctionwhere_lt($field="",$x){
$this->where_init($field);
$this->wheres[$field]['$lt']=$x;
return($this);
}
/**
*
*WHERELESSTHANOREQUALTOPARAMETERS*
*
*Getthedocumentswherethevalueof
a$fieldislessthanorequalto$x
*
*@usage=$this->mongo_db->where_lte('foo',20);
*/
publicfunctionwhere_lte($field="",$x){
$this->where_init($field);
$this->wheres[$field]['$lte']=$x;
return($this);
}
/**
*
*WHEREBETWEENPARAMETERS*
*
*Getthedocumentswherethevalueof
a$fieldisbetween$xand$y
*
*@usage=$this->mongo_db->where_between('foo',20,30);
*/
publicfunctionwhere_between($field="",$x,$y){
$this->where_init($field);
$this->wheres[$field]['$gte']=$x;
$this->wheres[$field]['$lte']=$y;
return($this);
}
/**
*
*WHEREBETWEENANDNOTEQUALTOPARAMETERS*
*
*Getthedocumentswherethevalueof
a$fieldisbetweenbutnotequalto$xand$y
*
*@usage=$this->mongo_db->where_between_ne('foo',20,30);
*/
publicfunctionwhere_between_ne($field="",$x,$y){
$this->where_init($field);
$this->wheres[$field]['$gt']=$x;
$this->wheres[$field]['$lt']=$y;
return($this);
}
/**
*
*WHERENOTEQUALTOPARAMETERS*
*
*Getthedocumentswherethevalueof
a$fieldisnotequalto$x
*
*@usage=$this->mongo_db->where_between('foo',20,30);
*/
publicfunctionwhere_ne($field="",$x){
$this->where_init($field);
$this->wheres[$field]['$ne']=$x;
return($this);
}
/**
*
*WHEREOR*
*
*Getthedocumentswherethevalueof
a$fieldisinoneormorevalues
*
*@usage=$this->mongo_db->where_or('foo',array('foo','bar','blegh');
*/
publicfunctionwhere_or($field="",$values){
$this->where_init($field);
$this->wheres[$field]['$or']=$values;
return($this);
}
/**
*
*WHEREAND*
*
*Getthedocumentswheretheelementsmatch
thespecifiedvalues*
*@usage=$this->mongo_db->where_and(array('foo'=>1,'b'=>'someexample');
*/
publicfunctionwhere_and($elements_values=array()){
foreach((array)$elements_valuesas$element=>$val){
$this->wheres[$element]=$val;
}return($this);
}
/**
*
*WHEREMOD*
*
*Getthedocumentswhere$field%$mod=$result*
*@usage=$this->mongo_db->where_mod('foo',10,1);
*/
publicfunctionwhere_mod($field,$num,$result){
$this->where_init($field);
$this->wheres[$field]['$mod']=array($num,$result);
return($this);
}
/****Wheresize***Getthedocumentswherethesizeofafieldisinagiven$sizeint**@usage:$this->mongo_db->where_size('foo',1)->get('foobar');*/
publicfunctionwhere_size($field="",$size=""){
$this->_where_init($field);
$this->wheres[$field]['$size']=$size;
return($this);
}
/**
*
*LIKEPARAMETERS*
*
*Getthedocumentswherethe(string)valueof
a$fieldislikeavalue.Thedefaults
*allowforacase-insensitivesearch.*
*@param$flags
*Allowsforthetypicalregularexpressionflags:
*i=caseinsensitive
*m=multiline
*x=cancontaincomments
*l=locale
*s=dotall,"."matcheseverything,includingnewlines
*u=matchunicode
*
*@param$enable_start_wildcard
*IfsettoanythingotherthanTRUE,astartinglinecharacter"^"willbeprepended
*tothesearchvalue,representingonlysearchingforavalueatthestartof
*anewline.
**@param$enable_end_wildcard
*IfsettoanythingotherthanTRUE,anendinglinecharacter"$"willbeappended
*tothesearchvalue,representingonlysearchingforavalueattheendof
*aline.
*
*@usage=$this->mongo_db->like('foo','bar','im',FALSE,TRUE);
*/
publicfunctionlike($field="",$value="",$flags="i",$enable_start_wildcard=TRUE,$enable_end_wildcard=TRUE){
$field=(string)trim($field);
$this->where_init($field);
$value=(string)trim($value);
$value=quotemeta($value);
if($enable_start_wildcard!==TRUE){
$value="^".$value;
}if($enable_end_wildcard!==TRUE){
$value.="$";
}$regex="/$value/$flags";
$this->wheres[$field]=newMongoRegex($regex);
return($this);
}
publicfunctionwheres($where){
$this->wheres=$where;
}
/**
*
*ORDERBYPARAMETERS*
*
*Sortthedocumentsbasedontheparameterspassed.
Tosetvaluestodescendingorder,
*youmustpassvaluesofeither-1,FALSE,
'desc',or'DESC',elsetheywillbe
*setto1(ASC).
*
*@usage=$this->mongo_db->where_between('foo',20,30);
*/
publicfunctionorder_by($fields=array()){
if(!is_array($fields)||!count($fields))return;
foreach($fieldsas$col=>$val){
if($val==-1||$val===FALSE||strtolower($val)=='desc'){
$this->sorts[$col]=-1;
}else{
$this->sorts[$col]=1;
}
}return($this);
}
/**
*
*LIMITDOCUMENTS*
*
*Limittheresultsetto$xnumberofdocuments*
*@usage=$this->mongo_db->limit($x);
*/
publicfunctionlimit($x=99999){
if($x!==NULL&&is_numeric($x)&&$x>=1){
$this->limit=(int)$x;
}return($this);
}
/**
*
*OFFSETDOCUMENTS*
*
*Offsettheresultsettoskip$xnumberofdocuments
*
*@usage=$this->mongo_db->offset($x);
*/
publicfunctionoffset($x=0){
if($x!==NULL&&is_numeric($x)&&$x>=1){
$this->offset=(int)$x;
}return($this);
}
/**
*
*GET_WHERE*
*
*Getthedocumentsbaseduponthepassedparameters*
*@usage=$this->mongo_db->get_where('foo',array('bar'=>'something'));
*/
publicfunctionget_where($collection="",$where=array(),$limit=99999,$orderby=array()){
if(is_array($orderby)||!emptyempty($orderby)){
$order_by=$this->order_by($order_by);
}
return($this->where($where)->limit($limit)->get($collection));
}
publicfunctionselectA($collection="",$limit=99999,$orderby=array()){
if(intval($limit)<1){
$limit=999999;
}
$order_by=$this->order_by($orderby);
$re=$this->limit($limit)->get($collection);
$this->clear();
return(array)$re;
}
publicfunctionlistinfo($collection="",$orderby=array(),$page=1,$pagesize=12){
$page=max(intval($page),1);
$offset=$pagesize*($page-1);
$pagesizes=$offset+$pagesize;
$this->offset($offset);
$order_by=$this->order_by($orderby);
$re=$this->limit($pagesize)->get($collection);
$this->limit(999999);
$count=$this->count($collection);
$this->pages=pages($count,$page,$pagesize);
return(array)$re;
}
/**
*
*GET*
*
*Getthedocumentsbaseduponthepassedparameters*
*@usage=$this->mongo_db->get('foo',array('bar'=>'something'));
*/
publicfunctionget($collection=""){
if(emptyempty($collection)){
$this->error("InordertoretreivedocumentsfromMongoDB,acollectionnamemustbepassed",500);
}$results=array();
$documents=$this->db->{$collection}->find($this->wheres,$this->selects)->limit((int)$this->limit)->skip((int)$this->offset)->sort($this->sorts);
$returns=array();
foreach($documentsas$doc):$returns[]=$doc;
endforeach;
return($returns);
}
publicfunctiongetMy($collection=""){
if(emptyempty($collection)){
$this->error("InordertoretreivedocumentsfromMongoDB,acollectionnamemustbepassed",500);
}$results=array();
$documents=$this->db->{$collection}->find($this->wheres,$this->selects)->limit((int)$this->limit)->skip((int)$this->offset)->sort($this->sorts);
$returns=array();
foreach($documentsas$doc):$returns[]=$doc;
endforeach;
$this->clear();
return($returns);
}
/**
*
*COUNT*
*
*Countthedocumentsbaseduponthepassedparameters*
*@usage=$this->mongo_db->get('foo');
*/
publicfunctioncount($collection=""){
if(emptyempty($collection)){
$this->error("InordertoretreiveacountofdocumentsfromMongoDB,acollectionnamemustbepassed",500);
}$count=$this->db->{$collection}->find($this->wheres)->limit((int)$this->limit)->skip((int)$this->offset)->count();
$this->clear();
return($count);
}
/**
*
*INSERT*
*
*Insertanewdocumentintothepassedcollection*
*@usage=$this->mongo_db->insert('foo',$data=array());
*/
publicfunctioninsert($collection="",$data=array(),$name='ID'){
if(emptyempty($collection)){
$this->error("NoMongocollectionselectedtoinsertinto",500);
}if(count($data)==0||!is_array($data)){
$this->error("NothingtoinsertintoMongocollectionorinsertisnotanarray",500);
}try{
/**
wxcity_base::load_sys_class('whtysqs','',0);
$mongoseq_class=newwhtysqs('creaseidsqs');
$re=$mongoseq_class->query("?name=".$collection."&opt=put&data=1");
**/
$re=put_sqs('list_mongo_creaseidsqs','1');
if(is_numeric($re)){
$re++;
$data[$name]=intval($re);
}else{
$data[$name]=intval(time());
//die('mongosqserror');
}
$this->db->{$collection}->insert($data,array('fsync'=>TRUE));
$this->clear();
return$data[$name];
}catch(MongoCursorException$e){
$this->error("InsertofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
publicfunctioninsertWithId($collection="",$data=array()){
if(emptyempty($collection)){
$this->error("NoMongocollectionselectedtoinsertinto",500);
}if(count($data)==0||!is_array($data)){
$this->error("NothingtoinsertintoMongocollectionorinsertisnotanarray",500);
}try{
$this->db->{$collection}->insert($data,array('fsync'=>TRUE));
$this->clear();
return1;
}catch(MongoCursorException$e){
$this->error("InsertofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*
*UPDATE*
*
*Updateadocumentintothepassedcollection*
*@usage=$this->mongo_db->update('foo',$data=array());
*/
publicfunctionupdate($collection="",$data=array()){
if(emptyempty($collection)){
$this->error("NoMongocollectionselectedtoupdate",500);
}if(count($data)==0||!is_array($data)){
$this->error("NothingtoupdateinMongocollectionorupdateisnotanarray",500);
}try{
$this->db->{$collection}->update($this->wheres,array('$set'=>$data),array('fsync'=>TRUE,'multiple'=>FALSE));
$this->clear();
return(TRUE);
}catch(MongoCursorException$e){
$this->error("UpdateofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*
*UPDATE_ALL*
*
*Insertanewdocumentintothepassedcollection*
*@usage=$this->mongo_db->update_all('foo',$data=array());
*/
publicfunctionupdate_all($collection="",$data=array()){
if(emptyempty($collection)){
$this->error("NoMongocollectionselectedtoupdate",500);
}if(count($data)==0||!is_array($data)){
$this->error("NothingtoupdateinMongocollectionorupdateisnotanarray",500);
}try{
$this->db->{$collection}->update($this->wheres,array('$set'=>$data),array('fsync'=>TRUE,'multiple'=>TRUE));
return(TRUE);
}catch(MongoCursorException$e){
$this->error("UpdateofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*
*DELETE*
*
*deletedocumentfromthepassedcollectionbaseduponcertaincriteria*
*@usage=$this->mongo_db->delete('foo',$data=array());
*/
publicfunctiondelete($collection=""){
if(emptyempty($collection)){
$this->error("NoMongocollectionselectedtodeletefrom",500);
}try{
$this->db->{$collection}->remove($this->wheres,array('fsync'=>TRUE,'justOne'=>TRUE));
$this->clear();
return(TRUE);
}catch(MongoCursorException$e){
$this->error("DeleteofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*
*DELETE_ALL*
*
*Deletealldocumentsfromthepassedcollectionbaseduponcertaincriteria
*
*@usage=$this->mongo_db->delete_all('foo',$data=array());
*/
publicfunctiondelete_all($collection=""){
if(emptyempty($collection)){
$this->error("NoMongocollectionselectedtodeletefrom",500);
}try{
$this->db->{$collection}->remove($this->wheres,array('fsync'=>TRUE,'justOne'=>FALSE));
return(TRUE);
}catch(MongoCursorException$e){
$this->error("DeleteofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*
*ADD_INDEX*
*
*Ensureanindexofthekeysinacollectionwithoptionalparameters.
Tosetvaluestodescendingorder,
*youmustpassvaluesofeither-1,FALSE,'desc',or'DESC',elsetheywillbe
*setto1(ASC).*
*@usage=$this->mongo_db->add_index($collection,array('first_name'=>'ASC','last_name'=>-1),array('unique'=>TRUE));
*/
publicfunctionadd_index($collection="",$keys=array(),$options=array()){
if(emptyempty($collection)){
$this->error("NoMongocollectionspecifiedtoaddindexto",500);
}if(emptyempty($keys)||!is_array($keys)){
$this->error("IndexcouldnotbecreatedtoMongoDBCollectionbecausenokeyswerespecified",500);
}foreach($keysas$col=>$val){
if($val==-1||$val===FALSE||strtolower($val)=='desc'){
$keys[$col]=-1;
}else{
$keys[$col]=1;
}
}if($this->db->{$collection}->ensureIndex($keys,$options)==TRUE){
$this->clear();
return($this);
}else{
$this->error("AnerroroccuredwhentryingtoaddanindextoMongoDBCollection",500);
}
}
/**
*
*REMOVE_INDEX*
*
*Removeanindexofthekeysinacollection.
Tosetvaluestodescendingorder,
*youmustpassvaluesofeither-1,FALSE,'desc',or'DESC',elsetheywillbe
*setto1(ASC).*
*@usage=$this->mongo_db->remove_index($collection,array('first_name'=>'ASC','last_name'=>-1));
*/
publicfunctionremove_index($collection="",$keys=array()){
if(emptyempty($collection)){
$this->error("NoMongocollectionspecifiedtoremoveindexfrom",500);
}if(emptyempty($keys)||!is_array($keys)){
$this->error("IndexcouldnotberemovedfromMongoDBCollectionbecausenokeyswerespecified",500);
}if($this->db->{$collection}->deleteIndex($keys,$options)==TRUE){
$this->clear();
return($this);
}else{
$this->error("AnerroroccuredwhentryingtoremoveanindexfromMongoDBCollection",500);
}
}
/**
*
*REMOVE_ALL_INDEXES*
*
*Removeallindexesfromacollection.*
*@usage=$this->mongo_db->remove_all_index($collection);
*/
publicfunctionremove_all_indexes($collection=""){
if(emptyempty($collection)){
$this->error("NoMongocollectionspecifiedtoremoveallindexesfrom",500);
}$this->db->{$collection}->deleteIndexes();
$this->clear();
return($this);
}
/**
*
*LIST_INDEXES*
*
*Listsallindexesinacollection.*
*@usage=$this->mongo_db->list_indexes($collection);
*/
publicfunctionlist_indexes($collection=""){
if(emptyempty($collection)){
$this->error("NoMongocollectionspecifiedtoremoveallindexesfrom",500);
}return($this->db->{$collection}->getIndexInfo());
}
/**
*
*DROPCOLLECTION*
*
*Removesthespecifiedcollectionfromthedatabase.
Becarefulbecausethis
*canhavesomeverylargeissuesinproduction!
*/
publicfunctiondrop_collection($collection=""){
if(emptyempty($collection)){
$this->error("NoMongocollectionspecifiedtodropfromdatabase",500);
}$this->db->{$collection}->drop();
returnTRUE;
}
/**
*
*CLEAR*
*
*Resetstheclassvariablestodefaultsettings
*/
privatefunctionclear(){
$this->selects=array();
$this->wheres=array();
$this->limit=NULL;
$this->offset=NULL;
$this->sorts=array();
}
/**
*
*WHEREINITIALIZER*
*
*Preparesparametersforinsertionin$wheresarray().
*/
privatefunctionwhere_init($param){
if(!isset($this->wheres[$param])){
$this->wheres[$param]=array();
}
}
publicfunctionerror($str,$t){
echo$str;
exit;
}
}
?>
使用范例:
$table_name=trim(strtolower($this->table_name));
$this->mongo_db->where($where);
$order=!emptyempty($order)?array('AID'=>'DESC'):array('AID'=>'ASC');
//升序降序
$infos=$this->mongo_db->listinfo($table_name,$order,$page,$pagesize);
希望本文所述对大家的php程序设计有所帮助。