加入收藏 | 设为首页 | 会员中心 | 我要投稿 咸宁站长网 (https://www.0715zz.cn/)- 文字识别、智能机器人、媒体智能、低代码、运维!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php操作MongoDB类实例

发布时间:2022-06-21 09:39:35 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了php操作MongoDB类的方法,实例分析了仿照CI实现的MongoDB类及其操作技巧,需要的朋友可以参考下。 本文实例讲述了php操作MongoDB类的方法,分享给大家供大家参考,具体如下: 1. MyMongo.php文件: ?php /** * 仿写CI的MongoDB * @author sp
  这篇文章主要介绍了php操作MongoDB类的方法,实例分析了仿照CI实现的MongoDB类及其操作技巧,需要的朋友可以参考下。
 
  本文实例讲述了php操作MongoDB类的方法,分享给大家供大家参考,具体如下:
 
  1. MyMongo.php文件:
 
  <?php
  /**
   * 仿写CI的MongoDB
   * @author sparkHuang 2011-11-03
   *
   */
  class MyMongo {
    private $mongo_config = "mongo_config.php";
    private $connection;
    private $db;
    private $mongo_connect_string;
    private $host;
    private $port;
    private $user;
    private $pass;
    private $dbname;
    private $persist;
    private $persist_key;
    private $selects = array();
    private $wheres = array();
    private $sorts = array();
    private $limit = 999999;
    private $offset = 0;
    public function __construct() {
      if ( ! class_exists('Mongo')) {
        $this->log_error("The MongoDB PECL extentiosn has not been installed or enabled.");
        exit;
      }
        
      $this->connection_string();
      $this->connect();
    }
    /**
     * 更改数据库
     *
     */
    public function switch_db($database = '') {
      if (emptyempty($database)) {
        $this->log_error("To switch MongoDB databases, a new database name must be specified");
        exit;
      }
      $this->dbname = $database;
      try {
        $this->db = $this->connection->{$this->dbname};
        return true;
      } catch(Exception $e) {
        $this->log_error("Unable to switch Mongo Databases: {$e->getMessage()}");
        exit;
      }
    }
    /**
     * 设置select字段
     *
     */
    public function select($includs = array(), $excludes = array()) {
      if ( ! is_array($includs)) {
        $includs = (array)$includs;
      }
        
      if ( ! is_array($excludes)) {
        $excludes = (array)$excludes;
      }
        
      if ( ! emptyempty($includs)) {
        foreach ($includs as $col) {
          $this->selects[$col] = 1;
        }
      } else {
        foreach ($excludes as $col) {
          $this->selects[$col] = 0;
        }
      }
        
      return($this);
    }
    /**
     * where条件查询判断
     *
     * @usage = $this->mongo_db->where(array('foo' => 'bar'))->get('foobar');
     *
     */
    public function where($wheres = array()) {
      if ( ! is_array($wheres)) {
        $wheres = (array)$wheres;
      }
        
      if ( ! emptyempty($wheres)) {
        foreach($wheres as $wh => $val) {
          $this->wheres[$wh] = $val;
        }
      }
        
      return($this);
    }
    /**
     * where ... in .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_in('foo', array('bar', 'zoo'))->get('foobar');
     *
     */
    public function where_in($field = '', $in = array()) {
      $this->where_init($field);
      $this->wheres[$field]['$in'] = $in;
      return($this);
    }
    /**
     * where ... not in .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_not_in('foo', array('bar', 'zoo'))->get('foobar');
     *
     */
    public function where_not_in($field = '', $in = array()) {
      $this->where_init($field);
      $this->wheres[$field]['$nin'] = $in;
      return($this);
    }
    /**
     * where ... $field > $x .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_gt('foo', 20)->get('foobar');
     *
     */
    public function where_gt($field = '', $x) {
      $this->where_init($field);
      $this->wheres[$field]['$gt'] = $x;
      return($this);
    }
    /**
     * where ... $field >= $x .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_gte('foo', 20)->get('foobar');
     *
     */
    public function where_gte($field = '', $x) {
      $this->where_init($field);
      $this->wheres[$field]['$gte'] = $x;
      return($this);
    }
    /**
     * where ... $field < $x .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_lt('foo', 20)->get('foobar');
     *
     */
    public function where_lt($field = '', $x) {
      $this->where_init($field);
      $this->wheres[$field]['$lt'] = $x;
      return($this);
    }
    /**
     * where ... $field <= $x .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_lte('foo', 20)->get('foobar');
     *
     */
    public function where_lte($field = '', $x) {
      $this->where_init($field);
      $this->wheres[$field]['$lte'] = $x;
      return($this);
    }
    /**
     * where ... $field >= $x AND $field <= $y .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_between('foo', 20, 30)->get('foobar');
     *
     */
    public function where_between($field = '', $x, $y) {
      $this->where_init($field);
      $this->wheres[$field]['$gte'] = $x;
      $this->wheres[$field]['$lte'] = $y;
      return($this);
    }
    /**
     * where ... $field > $x AND $field < $y .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_between_ne('foo', 20, 30)->get('foobar');
     *
     */
    public function where_between_ne($field = '', $x, $y) {
      $this->where_init($field);
      $this->wheres[$field]['$gt'] = $x;
      $this->wheres[$field]['$lt'] = $y;
      return($this);
    }
    /**
     * where ... $field <> $x .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_ne('foo', 20)->get('foobar');
     *
     */
    public function where_ne($field = '', $x) {
      $this->where_init($field);
      $this->wheres[$field]['$ne'] = $x;
      return($this);
    }
    /**
     * where ... or .. 条件查询判断
     *
     * @usage = $this->mongo_db->where_or('foo', array('foo', 'bar'))->get('foobar');
     *
     */
    public function where_or($field = '', $values) {
      $this->where_init($field);
      $this->wheres[$field]['$or'] = $values;
      return($this);
    }
    /**
     *  where ... and .. 条件查询判断
     *   
     *  @usage = $this->mongo_db->where_and( array ( 'foo' => 1, 'b' => 'someexample' );
     */
     public function where_and( $elements_values = array() ) {
       foreach ( $elements_values as $element => $val ) {
         $this->wheres[$element] = $val;
       }
       return($this);
     }
    /**
     *  where $field % $num = $result
     *
     *  @usage = $this->mongo_db->where_mod( 'foo', 10, 1 );
     */   
     public function where_mod( $field, $num, $result ) {
       $this->where_init($field);
       $this->wheres[$field]['$mod'] = array($num, $result);
       return($this);
     }
    /**
     * where size
     *
     *  Get the documents where the size of a field is in a given $size int
     *
     *  @usage : $this->mongo_db->where_size('foo', 1)->get('foobar');
     */
    public function where_size($field = "", $size = "") {
      $this->where_init($field);
      $this->wheres[$field]['$size'] = $size;
      return ($this);
    }
    /**
     * like条件查询(PHP中定义MongoRegex类实现)
     *
     * @usage : $this->mongo_db->like('foo', 'bar', 'im', false, false)->get();
     */
    public function like($field = "", $value = "", $flags = "i", $enable_start_wildcard = true, $enable_end_wildcard = true) {
      $field = (string)$field;
      $this->where_init($field);
      $value = (string)$value;
      $value = quotmeta($value);
        
      if (true !== $enable_start_wildcard) {
        $value = "^".$value;
      }
        
      if (true !== $enable_end_wildcard) {
        $value .= "$";
      }
        
      $regex = "/$value/$flags";
      $this->wheres[$field] = new MongoRegex($regex);
      return($this);
    }
    /**
     * order排序( 1 => ASC, -1 => DESC)
     *
     * @usage: $this->mongo_db->get_where('foo', array('name' => 'tom'))->order_by(array("age" => 1));
     */
    public function order_by($fields = array()) {
      foreach($fields as $col => $val) {
        if ($val == -1 || $val == false || strtolower($val) == "desc") {
          $this->sorts[$col] = -1;
        } else {
          $this->sorts[$col] = 1;
        }
      }
      return($this);
    }
    /**
     * limit
     *
     * @usage: $this->mongo_db->get_where('foo', array('name' => 'tom'))->limit(10);
     */
    public function limit($x = 999999) {
      if ($x !== NULL && is_numeric($x) && $x >= 1) {
        $this->limit = (int)$x;
      }
      return($this);
    }
    /**
     * offset
     *
     * @usage: $this->mongo_db->get_where('foo', array('name' => 'tom'))->offset(10);
     */
    public function offset($x = 0) {
       if($x !== NULL && is_numeric($x) && $x >= 1) {
         $this->offset = (int) $x;
       }
       return($this);
    }
    /**
     * get_where
     *  
     * @usage: $this->mongo_db->get_where('foo', array('bar' => 'something'));
     */
    public function get_where($collection = "", $where = array(), $limit = 999999) {
      return($this->where($where)->limit($limit)->get($collection));
    }
    /**
     * get
     *
     * @usage: $this->mongo_db->where(array('name' => 'tom'))->get('foo');
     */
    public function get($collection) {
      if (emptyempty($collection)) {
        $this->log_error("In order to retreive documents from MongoDB, a collection name must be passed");
        exit;
      }
      $results = array();
      $results = $this->db->{$collection}->find($this->wheres, $this->selects)->limit((int)$this->limit)->skip((int)$this->offset)->sort($this->sorts);
      $returns = array();
      foreach($results as $result) {
        $returns[] = $result;
      }
      $this->clear();
      return($returns);
    }
    /**
     * count
     *
     * @usage: $this->db->get_where('foo', array('name' => 'tom'))->count('foo');  
     */
    public function count($collection) {
      if (emptyempty($collection)) {
        $this->log_error("In order to retreive documents from MongoDB, a collection name must be passed");
        exit;
      }
      $count = $this->db->{$collection}->find($this->wheres)->limit((int)$this->limit)->skip((int)$this->offset)->count();
      $this->clear();
      return($count);
    }
    /**
     * insert
     *
     * @usage: $this->mongo_db->insert('foo', array('name' => 'tom'));
     */
    public function insert($collection = "", $data = array()) {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection selected to delete from");
        exit;
      }
      if (count($data) == 0 || ! is_array($data)) {
        $this->log_error("Nothing to insert into Mongo collection or insert is not an array");
        exit;
      }
      try {
        $this->db->{$collection}->insert($data, array('fsync' => true));
        if (isset($data['_id'])) {
          return($data['_id']);
        } else {
          return(false);
        }
      } catch(MongoCursorException $e) {
        $this->log_error("Insert of data into MongoDB failed: {$e->getMessage()}");
        exit;
      }
    }
    /**
     * update : 利用MongoDB的 $set 实现
     *
     * @usage : $this->mongo_db->where(array('name' => 'tom'))->update('foo', array('age' => 24))
     */
    public function update($collection = "", $data = array()) {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection selected to delete from");
        exit;
      }
      if (count($data) == 0 || ! is_array($data)) {
        $this->log_error("Nothing to update in Mongo collection or update is not an array");
        exit;
      }
      try {
        $this->db->{$collection}->update($this->wheres, array('$set' => $data), array('fsync' => true, 'multiple' => false)); //注意: multiple为false
        return(true);
      } catch(MongoCursorException $e) {
        $this->log_error("Update of data into MongoDB failed: {$e->getMessage()}");
        exit;
      }
    }
    /**
     * update_all : 利用MongoDB的 $set 实现
     *
     * @usage : $this->mongo_db->where(array('name' => 'tom'))->update_all('foo', array('age' => 24));
     */
    public function update_all($collection = "", $data = array()) {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection selected to delete from");
        exit;
      }
      if (count($data) == 0 || ! is_array($data)) {
        $this->log_error("Nothing to update in Mongo collection or update is not an array");
        exit;
      }
      try {
        $this->db->{$collection}->update($this->wheres, array('$set' => $data), array('fsync' => true, 'multiple' => true)); //注意: multiple为true
        return(true);
      } catch(MongoCursorException $e) {
        $this->log_error("Update of data into MongoDB failed: {$e->getMessage()}");
        exit;
      }
    }
    /**
     * delete  
     *
     * @usage : $this->mongo_db->where(array('name' => 'tom'))->delete('foo');
     */
    public function delete($collection = "") {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection selected to delete from");
        exit;
      }
      try {
        $this->db->{$collection}->remove($this->wheres, array('fsync' => true, 'justOne' => true)); //注意justOne为true;
      } catch(MongoCursorException $e) {
        $this->log_error("Delete of data into MongoDB failed: {$e->getMessage()}");
        exit;
      }
    }   
    /**
     * delete_all
     *
     * @usage : $this->mongo_db->where(array('name' => 'tom'))->delete_all('foo');
     */
    public function delete_all($collection = "") {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection selected to delete from");
        exit;
      }
      try {
        $this->db->{$collection}->remove($this->wheres, array('fsync' => true, 'justOne' => false)); //注意justOne为false;
      } catch(MongoCursorException $e) {
        $this->log_error("Delete of data into MongoDB failed: {$e->getMessage()}");
        exit;
      }
    }
    /**  
     * add_index
     *
     * @usage : $this->mongo_db->add_index('foo', array('first_name' => 'ASC', 'last_name' => -1), array('unique' => true)));
     */
    public function add_index($collection, $keys = array(), $options = array()) {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection specified to add index to");
        exit;
      }
      if (emptyempty($keys) || ! is_array($keys)) {
        $this->log_error("Index could not be created to MongoDB Collection because no keys were specified");
        exit;
      }
      foreach($keys as $col => $val) {
        if ($val == -1 || $val == false || strtolower($val) == 'desc') {
          $keys[$col] = -1;
        } else {
          $keys[$col] = 1;
        }
      }
      //在此没有对$options数组的有效性进行验证
      if (true == $this->db->{$collection}->ensureIndex($keys, $options)) {
        $this->clear();
        return($this);
      } else {
        $this->log_error("An error occured when trying to add an index to MongoDB Collection");
        exit;
      }
    }
    /**
     * remove_index
     *
     * @usage : $this->mongo_db->remove_index('foo', array('first_name' => 'ASC', 'last_name' => -1))
     */
    public function remove_index($collection = "", $keys = array()) {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection specified to add index to");
        exit;
      }
      if (emptyempty($keys) || ! is_array($keys)) {
        $this->log_error("Index could not be created to MongoDB Collection because no keys were specified");
        exit;
      }
      if ($this->db->{$collection}->deleteIndex($keys)) {
        $this->clear();
        return($this);
      } else {
        $this->log_error("An error occured when trying to add an index to MongoDB Collection");
        exit;
      }
    }
    /**
     * remove_all_index
     *
     * @usage : $this->mongo_db->remove_all_index('foo', array('first_name' => 'ASC', 'last_name' => -1))
     */
    public function remove_all_index($collection = "", $keys = array()) {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection specified to add index to");
        exit;
      }
      if (emptyempty($keys) || ! is_array($keys)) {
        $this->log_error("Index could not be created to MongoDB Collection because no keys were specified");
        exit;
      }
      if ($this->db->{$collection}->deleteIndexes($keys)) {
        $this->clear();
        return($this);
      } else {
        $this->log_error("An error occured when trying to add an index to MongoDB Collection");
        exit;
      }
    }
    /**
     * list_indexes
     *
     * @usage : $this->mongo_db->list_indexes('foo');
     */
    public function list_indexes($collection = "") {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection specified to add index to");
        exit;
      }
      return($this->db->{$collection}->getIndexInfo());
    }
    /**
     * drop_collection
     *
     * @usage : $this->mongo_db->drop_collection('foo');
     */
    public function drop_collection($collection = "") {
      if (emptyempty($collection)) {
        $this->log_error("No Mongo collection specified to add index to");
        exit;
      }
      $this->db->{$collection}->drop();
      return(true);
    }
    /**
     * 生成连接MongoDB 参数字符串
     *
     */
    private function connection_string() {
      include_once($this->mongo_config);
      $this->host = trim($config['host']);
      $this->port = trim($config['port']);
      $this->user = trim($config['user']);
      $this->pass = trim($config['pass']);
      $this->dbname = trim($config['dbname']);
      $this->persist = trim($config['persist']);
      $this->persist_key = trim($config['persist_key']);
      $connection_string = "mongodb://";
      if (emptyempty($this->host)) {
        $this->log_error("The Host must be set to connect to MongoDB");
        exit;
      }
      if (emptyempty($this->dbname)) {
        $this->log_error("The Database must be set to connect to MongoDB");
        exit;
      }
      if ( ! emptyempty($this->user) && ! emptyempty($this->pass)) {
        $connection_string .= "{$this->user}:{$this->pass}@";
      }
      if ( isset($this->port) && ! emptyempty($this->port)) {
        $connection_string .= "{$this->host}:{$this->port}";
      } else {
        $connection_string .= "{$this->host}";
      }
      $this->connection_string = trim($connection_string);
    }
    /**
     * 连接MongoDB 获取数据库操作句柄
     *
     */
    private function connect() {
      $options = array();
      if (true === $this->persist) {
        $options['persist'] = isset($this->persist_key) && ! emptyempty($this->persist_key) ? $this->persist_key : "ci_mongo_persist";
      }
      try {
        $this->connection = new Mongo($this->connection_string, $options);
        $this->db = $this->connection->{$this->dbname};
        return ($this);
      } catch (MongoConnectionException $e) {
        $this->log_error("Unable to connect to MongoDB: {$e->getMessage()}");
      }
    }
    /**
     * 初始化清理部分成员变量
     *  
     */
    private function clear() {
      $this->selects = array();
      $this->wheres = array();
      $this->limit = NULL;
      $this->offset = NULL;
      $this->sorts = array();
    }
    /**
     * 依据字段名初始化处理$wheres数组
     *
     */
    private function where_init($param) {
      if ( ! isset($this->wheres[$param])) {
        $this->wheres[$param] = array();
      }
    }
    /**
     * 错误记录
     *
     */
    private function log_error($msg) {
      $msg = "[Date: ".date("Y-m-i H:i:s")."] ".$msg;
      @file_put_contents("./error.log", print_r($msg."n", true), FILE_APPEND);
    }
  }
  /* End of MyMongo.php */
  2. mongo_config.php配置文件:
 
  <?php
  $config["host"] = "localhost";
  $config["user"] = "";
  $config["pass"] = "";
  $config["port"] = 27017;
  $config["dbname"] = "test";
  $config['persist'] = TRUE;
  $config['persist_key'] = 'ci_mongo_persist';
  /*End of mongo_config.php*/
  3. MyMongoDemo.php文件:
 
  <?php
  include_once("MyMongo.php");
  $conn = new MyMongo();
  //删除所有记录
  $conn->delete_all("blog");
  //插入第一条记录
  $value = array("name" => "小明", "age" => 25, "addr" => array("country" => "中国", "province" => "广西", "city" => "桂林"));
  $conn->insert("blog", $value);
  var_dump($conn->select(array("name", "age"))->get("blog"));
  var_dump($conn->get("blog"));
  /* End of MyMongoDemo.php */
 

(编辑:咸宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读