PHP实现的MongoDB数据库操作类分享


Posted in PHP onMay 12, 2014
class HMongodb {   

  private $mongo;  //Mongodb连接
  private $curr_db_name;
  private $curr_table_name;
  private $error;   

  public function getInstance($mongo_server, $flag=array())
  {
    static $mongodb_arr;
    if (empty($flag['tag']))
    {
      $flag['tag'] = 'default';     }
    if (isset($flag['force']) && $flag['force'] == true)
    {
      $mongo = new HMongodb($mongo_server);
      if (empty($mongodb_arr[$flag['tag']])) 
      {
        $mongodb_arr[$flag['tag']] = $mongo;
      }
      return $mongo;
    }
    else if (isset($mongodb_arr[$flag['tag']]) && is_resource($mongodb_arr[$flag['tag']]))
    {
      return $mongodb_arr[$flag['tag']];
    }
    else
    {
      $mongo = new HMongodb($mongo_server);
      $mongodb_arr[$flag['tag']] = $mongo;
      return $mongo;
    }
  }

  /**
   * 构造函数
   * 支持传入多个mongo_server(1.一个出问题时连接其它的server 2.自动将查询均匀分发到不同server)
   *
   * 参数:
   * $mongo_server:数组或字符串-array("127.0.0.1:1111", "127.0.0.1:2222")-"127.0.0.1:1111"
   * $connect:初始化mongo对象时是否连接,默认连接
   * $auto_balance:是否自动做负载均衡,默认是
   *
   * 返回值:
   * 成功:mongo object
   * 失败:false
   */
  private 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_keys as $key)
    {
    if ($key != $prior_server_num - 1)
    {
     $mongo_server_str .= ',' . $mongo_server[$key];
    }
    }
   }
   else
   {
    $mongo_server_str = implode(',', $mongo_server);
   }         }
   else
   {
    $mongo_server_str = $mongo_server;
   }
   try {
    $this->mongo = new Mongo($mongo_server, array('connect'=>$connect));
   }
   catch (MongoConnectionException $e)
   {
    $this->error = $e->getMessage();
    return false;
   }
  }

  /**
  * 连接mongodb server
  *
  * 参数:无
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  public function connect()
  {
    try {
      $this->mongo->connect();
      return true;
    }
    catch (MongoConnectionException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
  }   

  /**
  * select db
  *
  * 参数:$dbname
  *
  * 返回值:无
  */
  public function selectDb($dbname)
  {
    $this->curr_db_name = $dbname;
  }   

  /**
  * 创建索引:如索引已存在,则返回。
  *
  * 参数:
  * $table_name:表名
  * $index:索引-array("id"=>1)-在id字段建立升序索引
  * $index_param:其它条件-是否唯一索引等
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  public function ensureIndex($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);
      return true;
    }
    catch (MongoCursorException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
  }

  /**
  * 插入记录
  *
  * 参数:
  * $table_name:表名
  * $record:记录
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  public function insert($table_name, $record)
  {
    $dbname = $this->curr_db_name;
    try {
      $this->mongo->$dbname->$table_name->insert($record, array('safe'=>true));
      return true;
    }
    catch (MongoCursorException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
  }   

  /**
  * 查询表的记录数
  *
  * 参数:
  * $table_name:表名
  *
  * 返回值:表的记录数
  */
  public function count($table_name)
  {
    $dbname = $this->curr_db_name;
    return $this->mongo->$dbname->$table_name->count();
  }   

  /**
  * 更新记录
  *
  * 参数:
  * $table_name:表名
  * $condition:更新条件
  * $newdata:新的数据记录
  * $options:更新选择-upsert/multiple
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  public function update($table_name, $condition, $newdata, $options=array())
  {
    $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);
      return true;
    }
    catch (MongoCursorException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
  }   

  /**
  * 删除记录
  *
  * 参数:
  * $table_name:表名
  * $condition:删除条件
  * $options:删除选择-justOne
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  public function remove($table_name, $condition, $options=array())
  {
    $dbname = $this->curr_db_name;
    $options['safe'] = 1;
    try {
      $this->mongo->$dbname->$table_name->remove($condition, $options);
      return true;
    }
    catch (MongoCursorException $e)
    {
      $this->error = $e->getMessage();
      return false;
  }  }   

  /**
  * 查找记录
  *
  * 参数:
  * $table_name:表名
  * $query_condition:字段查找条件
  * $result_condition:查询结果限制条件-limit/sort等
  * $fields:获取字段
  *
  * 返回值:
  * 成功:记录集
  * 失败:false
  */
  public function find($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())
      {
        $result[] = $cursor->getNext();
      }
    }
    catch (MongoConnectionException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
    catch (MongoCursorTimeoutException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
    return $result;
  }   

  /**
  * 查找一条记录
  *
  * 参数:
  * $table_name:表名
  * $condition:查找条件
  * $fields:获取字段
  *
  * 返回值:
  * 成功:一条记录
  * 失败:false
  */
  public function findOne($table_name, $condition, $fields=array())
  {
    $dbname = $this->curr_db_name;
    return $this->mongo->$dbname->$table_name->findOne($condition, $fields);
  }   

  /**
  * 获取当前错误信息
  *
  * 参数:无
  *
  * 返回值:当前错误信息
  */
  public function getError()
  {
    return $this->error;
  }

  /*** Mongodb类** examples:
   * $mongo = new HMongodb("127.0.0.1:11223");
  * $mongo->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"));
  * 更新记录
  * $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("c", array("title"=>"asdqw"), array("start"=>2,"limit"=>2,"sort"=>array("id"=>1)))
  * 查找一条记录
  * $mongo->findOne("$mongo->findOne("ttt", array("id"=>1))", array("id"=>1));
  * 删除记录
  * $mongo->remove("ttt", array("title"=>"bbb"));
  * 仅删除一条记录
  * $mongo->remove("ttt", array("title"=>"bbb"), array("justOne"=>1));
  * 获取Mongo操作的错误信息
  * $mongo->getError();
  */

}
PHP 相关文章推荐
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
Aug 20 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
thinkPHP的表达式查询用法详解
Sep 14 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
浅谈PHP array_search 和 in_array 函数效率问题
Oct 15 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 #PHP
PHP三元运算的2种写法代码实例
May 12 #PHP
PHP入门之常量简介和系统常量
May 12 #PHP
PHP实现数字补零功能的2个函数介绍
May 12 #PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 #PHP
phpMyAdmin自动登录和取消自动登录的配置方法
May 12 #PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 #PHP
You might like
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
javascript中this关键字详解
2016/12/12 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
jQuery Jsonp跨域模拟搜索引擎
2017/06/17 jQuery
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
通过代码实例了解Python sys模块
2020/09/14 Python
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
空指针到底是什么
2012/08/07 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
酒店服务实习自我鉴定
2013/09/22 职场文书
高中自我鉴定
2013/12/20 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
群众路线个人整改措施
2014/10/24 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
会计工作检讨书
2015/02/19 职场文书
电影雨中的树观后感
2015/06/15 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
Redis Lua脚本实现ip限流示例
2022/07/15 Redis