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 相关文章推荐
实现“上一页”和“下一页按钮
Oct 09 PHP
Access数据库导入Mysql的方法之一
Oct 09 PHP
在数据量大(超过10万)的情况下
Jan 15 PHP
PHP目录函数实现创建、读取目录教程实例
Jan 13 PHP
php SQL Injection with MySQL
Feb 27 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
php生成高清缩略图实例详解
Dec 07 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
php版交通银行网银支付接口开发入门教程
Sep 26 PHP
php web环境和命令行环境下查找php.ini的位置
Jul 17 PHP
PHP 代码简洁之道(小结)
Oct 16 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
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
2011/04/27 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
Javascript算符的优先级介绍
2013/03/20 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
详解vue的diff算法原理
2018/05/20 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
python scrapy重复执行实现代码详解
2019/12/28 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
解决pytorch 模型复制的一些问题
2021/03/03 Python
HTML5 placeholder(空白提示)属性介绍
2013/08/07 HTML / CSS
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
肯尼迪就职演说稿
2013/12/31 职场文书
运动会演讲稿
2014/05/07 职场文书
清明节演讲稿
2014/05/27 职场文书
买卖合同协议书范本
2014/10/18 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL