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 相关文章推荐
两个强悍的php 图像处理类1
Jun 15 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
php生成动态验证码gif图片
Oct 19 PHP
php将数组存储为文本文件方法汇总
Oct 28 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
PHP中常见的密码处理方式和建议总结
Oct 14 PHP
PHP中类与对象功能、用法实例解读
Mar 27 PHP
php将xml转化对象的实例详解
Nov 17 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 foreach 使用&amp;(与运算符)引用赋值要注意的问题
2010/02/16 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
Jquery easyUI 更新行示例
2014/03/06 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
Python多线程编程简单介绍
2015/04/13 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
美国美妆网站:B-Glowing
2016/10/12 全球购物
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
AJAX的全称是什么
2012/11/06 面试题
司仪主持词两篇
2014/03/22 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
捐款感谢信
2015/01/20 职场文书
水电工程师岗位职责
2015/02/13 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS