PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】


Posted in PHP onJune 16, 2018

本文实例讲述了PHP mongodb操作类定义与用法。分享给大家供大家参考,具体如下:

在别人基础上修改的mongodb操作类,适合mongodb2.x和mongodb3.x

<?php
/*** 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"));
* 更新记录 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();
*/
class HMongodb {
  public $_idType=1;//主键类型 1 string 0 obj
  //Mongodb连接
  var $mongo;
  var $curr_db_name;
  var $curr_table_name;
  var $error;
  /**
  * 构造函数
  * 支持传入多个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
  */
  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 = 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 = new MongoClient($mongo_server, array('connect'=>$connect));
    }
    catch (MongoConnectionException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
  }
  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;         }     }
  /**
  * 连接mongodb server
  *
  * 参数:无
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  function connect()
  {
    try {
      $this->mongo->connect();
      return true;
    }
    catch (MongoConnectionException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
  }
  /**
  * select db
  *
  * 参数:$dbname
  *
  * 返回值:无
  */
  function selectDb($dbname)
  {
    $this->curr_db_name = $dbname;
  }
  /**
  * 创建索引:如索引已存在,则返回。
  *
  * 参数:
  * $table_name:表名
  * $index:索引-array("id"=>1)-在id字段建立升序索引
  * $index_param:其它条件-是否唯一索引等
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  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
  */
  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:表名
  *
  * 返回值:表的记录数
  */
  function count($table_name,$query_condition=array())
  {
    $dbname = $this->curr_db_name;
    return $this->mongo->$dbname->$table_name->find($query_condition)->count();
  }
  //$newdata存在有_id则更新 不存在则插入
  function save($table_name, $newdata) {
    $dbname = $this->curr_db_name;
    if($this->_idType && $newdata['_id']){
      $newdata['_id']=new MongoId($newdata['_id']);
    }
    return $this->mongo->$dbname->$table_name->save($newdata);
  }
  /**
  * 更新记录
  *
  * 参数:
  * $table_name:表名
  * $condition:更新条件
  * $newdata:新的数据记录
  * $options:更新选择-upsert/multiple
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  function update($table_name, $condition, $newdata, $options=array())
  {  if($this->_idType && $condition['_id']){
      $condition['_id']=new MongoId($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);
      return true;
    }
    catch (MongoCursorException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }     }
  /**
  * 删除记录
  *
  * 参数:
  * $table_name:表名
  * $condition:删除条件
  * $options:删除选择-justOne
  *
  * 返回值:
  * 成功:true
  * 失败:false
  */
  function remove($table_name, $condition, $options=array())
  {
    if($this->_idType && $condition['_id']){
      $condition['_id']=new MongoId($condition['_id']);
    }
    $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
  */
  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())
      {
        $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();
      return false;
    }
    catch (MongoCursorTimeoutException $e)
    {
      $this->error = $e->getMessage();
      return false;
    }
    return $result;
  }
  /**
  * 查找一条记录
  *
  * 参数:
  * $table_name:表名
  * $condition:查找条件
  * $fields:获取字段
  *
  * 返回值:
  * 成功:一条记录
  * 失败:false
  */
  function findOne($table_name, $condition, $fields=array())
  {
    if($this->_idType && $condition['_id']){
      $condition['_id']=new MongoId($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;
  }
  /**
  * 获取当前错误信息
  *
  * 参数:无
  *
  * 返回值:当前错误信息
  */
  function getError()
  {
    return $this->error;
  }
  //返回原生mongodb collection集合对象
  function getCollection($table_name){
    $dbname = $this->curr_db_name;
    return $this->mongo->$dbname->$table_name;
  }
  //分组统计
  function group($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 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
linux下编译安装memcached服务
Aug 03 PHP
php中Session的生成机制、回收机制和存储机制探究
Aug 19 PHP
33道php常见面试题及答案
Jul 06 PHP
php比较两个字符串长度的方法
Jul 13 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 #PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 #PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 #PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 #PHP
PHP堆栈调试操作简单示例
Jun 15 #PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 #PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 #PHP
You might like
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
分享ES6的7个实用技巧
2018/01/18 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
Python中__init__和__new__的区别详解
2014/07/09 Python
20招让你的Python飞起来!
2016/09/27 Python
详解Python多线程
2016/11/14 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
大学生新闻专业个人自我评价
2013/11/12 职场文书
大专应届生个人的自我评价
2013/11/21 职场文书
小饰品店的创业计划书范文
2013/12/28 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
母亲节主题班会
2015/08/14 职场文书
Selenium浏览器自动化如何上传文件
2022/04/06 Python
Nginx动静分离配置实现与说明
2022/04/07 Servers
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers