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执行速率优化技巧小结
Mar 15 PHP
PHP 程序员应该使用的10个组件
Oct 31 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
使用cookie实现统计访问者登陆次数
Jun 08 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
基于php的CMS中展示文章类实例分析
Jun 18 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
PHP实现图片批量打包下载功能
Mar 01 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
Jun 07 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 PHP
关于laravel 子查询 &amp; join的使用
Oct 16 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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
微信API接口大全
2015/04/15 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python用来获得图片exif信息的库实例分析
2015/03/16 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
大学生年度自我鉴定
2013/10/31 职场文书
室内拓展活动方案
2014/02/13 职场文书
教师节班会主持词
2015/07/06 职场文书
2016年十一促销广告语
2016/01/28 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
MySQL中varchar和char类型的区别
2021/11/17 MySQL
SpringBoot Http远程调用的方法
2022/08/14 Java/Android