php操作MongoDB类实例


Posted in PHP onJune 17, 2015

本文实例讲述了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 (empty($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 ( ! empty($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 ( ! empty($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 (empty($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 (empty($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 (empty($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 (empty($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 (empty($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 (empty($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 (empty($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 (empty($collection)) {
      $this->log_error("No Mongo collection specified to add index to");
      exit;
    }
    if (empty($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 (empty($collection)) {
      $this->log_error("No Mongo collection specified to add index to");
      exit;
    }
    if (empty($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 (empty($collection)) {
      $this->log_error("No Mongo collection specified to add index to");
      exit;
    }
    if (empty($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 (empty($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 (empty($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 (empty($this->host)) {
      $this->log_error("The Host must be set to connect to MongoDB");
      exit;
    }
    if (empty($this->dbname)) {
      $this->log_error("The Database must be set to connect to MongoDB");
      exit;
    }
    if ( ! empty($this->user) && ! empty($this->pass)) {
      $connection_string .= "{$this->user}:{$this->pass}@";
    }
    if ( isset($this->port) && ! empty($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) && ! empty($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 */

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
dedecms模版制作使用方法
Apr 03 PHP
php echo()和print()、require()和include()函数区别说明
Mar 27 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
PHP实现下载功能的代码
Sep 29 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
Sep 29 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
joomla数据库操作示例代码
Jan 06 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
零基础php编程好学吗
Oct 11 PHP
PHP实现的购物车类实例
Jun 17 #PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 #PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 #PHP
php使用curl打开https网站的方法
Jun 17 #PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 #PHP
PHP封装的HttpClient类用法实例
Jun 17 #PHP
PHP处理postfix邮件内容的方法
Jun 16 #PHP
You might like
php摘要生成函数(无乱码)
2012/02/04 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
取得传值的函数
2006/10/27 Javascript
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
JavaScript 32位整型无符号操作示例
2013/12/08 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
javaScript数组迭代方法详解
2016/04/14 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
对pandas中apply函数的用法详解
2018/04/10 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Python实现12306火车票抢票系统
2019/07/04 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
Python实现结构体代码实例
2020/02/10 Python
Python decimal模块使用方法详解
2020/06/08 Python
如何用python批量调整视频声音
2020/12/22 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
高级护理专业毕业生推荐信
2013/12/25 职场文书
大学生冰淇淋店商业计划书
2014/01/14 职场文书
乔迁宴答谢词
2014/01/21 职场文书
工程技术员岗位职责
2014/03/02 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
《自己去吧》教学反思
2016/02/16 职场文书