PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
本文实例讲述了PHPmongodb操作类定义与用法。分享给大家供大家参考,具体如下:
在别人基础上修改的mongodb操作类,适合mongodb2.x和mongodb3.x
selectDb("test_db");
*创建索引
*$mongo->ensureIndex("test_table",array("id"=>1),array('unique'=>true));
*获取表的记录
*$mongo->count("test_table");
*插入记录
*$mongo->insert("test_table",array("id"=>2,"title"=>"asdqw"));
*更新记录array('$set'=>$newdata)只修改指定字段
*$mongo->update("test_table",array("id"=>1),array("id"=>1,"title"=>"bbb"));
*更新记录-存在时更新,不存在时添加-相当于set
*$mongo->update("test_table",array("id"=>1),array("id"=>1,"title"=>"bbb"),array("upsert"=>1));
*查找记录
*$mongo->find("test_table",array("title"=>"asdqw"),array("start"=>2,"limit"=>2,"sort"=>array("id"=>1)))
*查找一条记录
*$mongo->findOne("test_table",array("id"=>1));
*删除记录
*$mongo->remove("ttt",array("title"=>"bbb"));
*仅删除一条记录
*$mongo->remove("ttt",array("title"=>"bbb"),array("justOne"=>1));
*获取Mongo操作的错误信息
*$mongo->getError();
*/
classHMongodb{
public$_idType=1;//主键类型1string0obj
//Mongodb连接
var$mongo;
var$curr_db_name;
var$curr_table_name;
var$error;
/**
*构造函数
*支持传入多个mongo_server(1.一个出问题时连接其它的server2.自动将查询均匀分发到不同server)
*
*参数:
*$mongo_server:数组或字符串-array("127.0.0.1:1111","127.0.0.1:2222")-"127.0.0.1:1111"
*$connect:初始化mongo对象时是否连接,默认连接
*$auto_balance:是否自动做负载均衡,默认是
*
*返回值:
*成功:mongoobject
*失败:false
*/
function__construct($mongo_server,$connect=true,$auto_balance=true)
{
if(is_array($mongo_server))
{
$mongo_server_num=count($mongo_server);
if($mongo_server_num>1&&$auto_balance)
{
$prior_server_num=rand(1,$mongo_server_num);
$rand_keys=array_rand($mongo_server,$mongo_server_num);
$mongo_server_str=$mongo_server[$prior_server_num-1];
foreach($rand_keysas$key)
{
if($key!=$prior_server_num-1)
{
$mongo_server_str.=','.$mongo_server[$key];
}
}
}
else
{
$mongo_server_str=implode(',',$mongo_server);
}}
else
{
$mongo_server_str=trim($mongo_server);
//$config_arr=explode('/',$mongo_server);
//$this->curr_db_name=array_pop($config_arr);
$last_index=strrpos($mongo_server_str,'/');
$db_name=substr($mongo_server_str,$last_index+1,strlen($mongo_server_str));
$this->curr_db_name=$db_name;//获取dbname
//print_r($db_name);exit;
}
try{
$this->mongo=newMongoClient($mongo_server,array('connect'=>$connect));
}
catch(MongoConnectionException$e)
{
$this->error=$e->getMessage();
returnfalse;
}
}
functiongetInstance($mongo_server,$flag=array())
{
static$mongodb_arr;
if(empty($flag['tag']))
{
$flag['tag']='default';}
if(isset($flag['force'])&&$flag['force']==true)
{
$mongo=newHMongodb($mongo_server);
if(empty($mongodb_arr[$flag['tag']]))
{
$mongodb_arr[$flag['tag']]=$mongo;
}
return$mongo;
}
elseif(isset($mongodb_arr[$flag['tag']])&&is_resource($mongodb_arr[$flag['tag']]))
{
return$mongodb_arr[$flag['tag']];
}
else
{
$mongo=newHMongodb($mongo_server);
$mongodb_arr[$flag['tag']]=$mongo;
return$mongo;}}
/**
*连接mongodbserver
*
*参数:无
*
*返回值:
*成功:true
*失败:false
*/
functionconnect()
{
try{
$this->mongo->connect();
returntrue;
}
catch(MongoConnectionException$e)
{
$this->error=$e->getMessage();
returnfalse;
}
}
/**
*selectdb
*
*参数:$dbname
*
*返回值:无
*/
functionselectDb($dbname)
{
$this->curr_db_name=$dbname;
}
/**
*创建索引:如索引已存在,则返回。
*
*参数:
*$table_name:表名
*$index:索引-array("id"=>1)-在id字段建立升序索引
*$index_param:其它条件-是否唯一索引等
*
*返回值:
*成功:true
*失败:false
*/
functionensureIndex($table_name,$index,$index_param=array())
{
$dbname=$this->curr_db_name;
$index_param['safe']=1;
try{
$this->mongo->$dbname->$table_name->ensureIndex($index,$index_param);
returntrue;
}
catch(MongoCursorException$e)
{
$this->error=$e->getMessage();
returnfalse;
}
}
/**
*插入记录
*
*参数:
*$table_name:表名
*$record:记录
*
*返回值:
*成功:true
*失败:false
*/
functioninsert($table_name,$record)
{
$dbname=$this->curr_db_name;
try{
$this->mongo->$dbname->$table_name->insert($record,array('safe'=>true));
returntrue;
}
catch(MongoCursorException$e)
{
$this->error=$e->getMessage();
returnfalse;
}
}
/**
*查询表的记录数
*
*参数:
*$table_name:表名
*
*返回值:表的记录数
*/
functioncount($table_name,$query_condition=array())
{
$dbname=$this->curr_db_name;
return$this->mongo->$dbname->$table_name->find($query_condition)->count();
}
//$newdata存在有_id则更新不存在则插入
functionsave($table_name,$newdata){
$dbname=$this->curr_db_name;
if($this->_idType&&$newdata['_id']){
$newdata['_id']=newMongoId($newdata['_id']);
}
return$this->mongo->$dbname->$table_name->save($newdata);
}
/**
*更新记录
*
*参数:
*$table_name:表名
*$condition:更新条件
*$newdata:新的数据记录
*$options:更新选择-upsert/multiple
*
*返回值:
*成功:true
*失败:false
*/
functionupdate($table_name,$condition,$newdata,$options=array())
{if($this->_idType&&$condition['_id']){
$condition['_id']=newMongoId($condition['_id']);
}
$dbname=$this->curr_db_name;
$options['safe']=1;
if(!isset($options['multiple']))
{
$options['multiple']=0;}
try{
$this->mongo->$dbname->$table_name->update($condition,$newdata,$options);
returntrue;
}
catch(MongoCursorException$e)
{
$this->error=$e->getMessage();
returnfalse;
}}
/**
*删除记录
*
*参数:
*$table_name:表名
*$condition:删除条件
*$options:删除选择-justOne
*
*返回值:
*成功:true
*失败:false
*/
functionremove($table_name,$condition,$options=array())
{
if($this->_idType&&$condition['_id']){
$condition['_id']=newMongoId($condition['_id']);
}
$dbname=$this->curr_db_name;
$options['safe']=1;
try{
$this->mongo->$dbname->$table_name->remove($condition,$options);
returntrue;
}
catch(MongoCursorException$e)
{
$this->error=$e->getMessage();
returnfalse;
}}
/**
*查找记录
*
*参数:
*$table_name:表名
*$query_condition:字段查找条件
*$result_condition:查询结果限制条件-limit/sort等
*$fields:获取字段
*
*返回值:
*成功:记录集
*失败:false
*/
functionfind($table_name,$query_condition,$result_condition=array(),$fields=array())
{
$dbname=$this->curr_db_name;
$cursor=$this->mongo->$dbname->$table_name->find($query_condition,$fields);
if(!empty($result_condition['start']))
{
$cursor->skip($result_condition['start']);
}
if(!empty($result_condition['limit']))
{
$cursor->limit($result_condition['limit']);
}
if(!empty($result_condition['sort']))
{
$cursor->sort($result_condition['sort']);
}
$result=array();
try{
while($cursor->hasNext())
{
$row=$cursor->getNext();
//print_r($cursor->getNext());exit;
if($this->_idType&&is_object($row['_id'])){
$row['_id']=$row['_id']->__toString();//转换字符串
}
$result[]=$row;
}
}
catch(MongoConnectionException$e)
{
$this->error=$e->getMessage();
returnfalse;
}
catch(MongoCursorTimeoutException$e)
{
$this->error=$e->getMessage();
returnfalse;
}
return$result;
}
/**
*查找一条记录
*
*参数:
*$table_name:表名
*$condition:查找条件
*$fields:获取字段
*
*返回值:
*成功:一条记录
*失败:false
*/
functionfindOne($table_name,$condition,$fields=array())
{
if($this->_idType&&$condition['_id']){
$condition['_id']=newMongoId($condition['_id']);
}
$dbname=$this->curr_db_name;
$row=$this->mongo->$dbname->$table_name->findOne($condition,$fields);
if($this->_idType&&is_object($row['_id'])){
$row['_id']=$row['_id']->__toString();//转换字符串
}
return$row;
}
/**
*获取当前错误信息
*
*参数:无
*
*返回值:当前错误信息
*/
functiongetError()
{
return$this->error;
}
//返回原生mongodbcollection集合对象
functiongetCollection($table_name){
$dbname=$this->curr_db_name;
return$this->mongo->$dbname->$table_name;
}
//分组统计
functiongroup($table_name,$keys,$initial,$reduce,$condition){
$dbname=$this->curr_db_name;
$g=$this->mongo->$dbname->$table_name->group($keys,$initial,$reduce,$condition);
return$g;
}
}
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP+MongoDB数据库操作技巧大全》、《PHP基于pdo操作数据库技巧总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。