`

写了一个PHP MongoDB 的封装,经管已经有了不少轮子了

阅读更多
<?php

/**
 * Description of MongoUtil
 * MongoDB 封装类
 * 参考 PHP Manual<br/>
 * use like this:<br/>
 * $mongodb = MongoUtil::init();<br/>
 * $mongodb->find('collection_name');<br/>
 * @link http://www.php.net/manual/zh/book.mongo.php<br/>
 * @link http://docs.mongodb.org/manual/<br/>
 * 
 * @author Nomandia
 */
include_once __DIR__ . '/Config.php';

class MongoUtil {

    private static $instance;
    public $mongo;
    public $db_name;
    public $coll_name;
    public $cursor;

    public $auto_connect = true;
    public $errors;
    
    /**
     * 静态数据库
     */
    const DB_MODLUE = 'mp_module';
    /**
     * 用户数据库
     */
    const DB_USERDATA = 'mp_userdata';

    function __construct() {
        $config = Config::$MONGO_SERVER;
        shuffle($config['hosts']);
        $host = $config['hosts'][0];
//        echo 'mongodb://'.$host['ip'].':'.$host['port'].'/'.self::DB_USERDATA.'<br/>';
        try{
// 权限的部分暂时免了,根据需要写默认连接的数据库,否则就是self::DB_USERDATA
            $this->mongo = new MongoClient('mongodb://'.$host['ip'].':'.$host['port'].'/'.self::DB_USERDATA, array(connect=>$this->auto_connect));
        } catch(Exception $ex){
            $this->errors= $ex->getMessage();
        }
        $this->connect();
    }

    public static function init() {
        if (!self::$instance) {
            self::$instance = new MongoUtil();
        }
        return self::$instance;
    }

    public function __clone() {
        ;
    }
    
    public function __destruct() {
        $this->mongo->close();
    }

    // **************** 实例化后的方法 ****************
    public function connect() {
        return $this->mongo->connect();
    }

    public function select_db($db_name){
        $this->db_name = $db_name;
        try{
            return $this->mongo->selectDB($db_name);
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
    }
    
    public function list_db(){
        try{
            return $this->mongo->listDBs();
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
        return null;
    }
    
    /**
     * 获取一个MongoCollection对象
     * @param string 数据库名
     * @param string 集合名
     * @return MongoCollection MongoDB集合
     */
    public function select_collection($db_name, $coll_name){
        $this->db_name = $db_name;
        $this->coll_name = $coll_name;
        try {
            return $this->mongo->selectCollection($db_name, $coll_name);
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
    }
    
    /**
     * 删除集合
     * @param string 集合名
     * @return bool 操作结果
     */
    public function drop($coll_name){
        $db_name = $this->db_name;
        return $this->mongo->$db_name->$coll_name->drop();
    }

    /**
     * 创建一个索引
     * @param string 集合名
     * @param array 字段名
     * @param array array(unique=>false), unique=true时创建唯一索引
     * @return bool 操作结果
     */
    public function create_index($coll_name, $keys, $options=array(unique=>false)) {
        $db_name = $this->db_name;
        try{
            return $this->mongo->$db_name->$coll_name->createIndex($keys, $options);
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
        return false;
    }
    
    /**
     * 执行一条命令
     * @param array 命令
     * @return array 执行结果
     */
    public function command($coll_name, $command){
        $db_name = $this->db_name;
        return $this->mongo->$db_name->$coll_name->command($command);
    }
    
    /**
     * 删除集合索引
     * @param string 集合名
     * @param array 键
     * @return bool 操作结果
     */
    public function delete_index($coll_name, $keys){
        $db_name = $this->db_name;
        return $this->mongo->$db_name->$coll_name->deleteIndex($keys);
    }
    
    /**
     * 删除集合所有的索引
     * @param string 集合名
     * @return bool 操作结果
     */
    public function delete_all_index($coll_name){
        $db_name = $this->db_name;
        return $this->mongo->$db_name->$coll_name->deleteIndexes();
    }

    /**
     * 插入文档到集合(支持批量插入)
     * @param string 集合名
     * @param array 文档
     * @return bool 是否插入成功
     */
    public function insert($coll_name, $docs) {
        $db_name = $this->db_name;
        return $this->mongo->$db_name->$coll_name->insert($docs);
    }
    
    /**
     * 保存一个结果(如果存在此对象则更新,否则插入)
     * @param string 集合名
     * @param array 文档
     * @return bool 插入结果
     */
    public function save($coll_name, $neo_data){
        $db_name = $this->db_name;
        try{
            return $this->mongo->$db_name->$coll_name->save($neo_data);
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
        return false;
    }

    /**
     * 更新一个文档
     * @param string 集合名
     * @param array 条件
     * @param array 更新的文档
     * @param array 选项 array(upsert=>0) upsert=1时,如果不存在符合条件的文档则将新文档插入 multiple=1时表示更新所有符合条件的记录,否则只会更新1条
     * @return bool 是否插入成功
     */
    public function update($coll_name, $condition, $neo_data, $options = array(fsync=>0, upsert=>0, multiple=>0)) {
        $db_name = $this->db_name;
        $options['save'] = 1;
        if ( !isset($options['multiple'])){
            $options['multiple'] = 0;
        }
        try{
            return $this->mongo->$db_name->$coll_name->update($condition, $neo_data, $options);
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
        return false;
    }

    /**
     * 删除集合记录
     * @param string 集合名
     * @param array 删除条件
     * @param array 选项 array(justOne=>0) justOne=1时只删除1条记录
     * @return bool 删除结果
     */
    public function remove($coll_name, $condition, $options = array(justOne=>0, fsync=>0)) {
        $db_name = $this->db_name;
        $options['save'] = 1;
        if ( !isset($options['justOne'])){
            $options['justOne'] = 0;
        }
        try{
            return $this->mongo->$db_name->$coll_name->remove($condition, $options);
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
        return false;
    }

    /**
     * 查询MongoDB
     * @param string 集合名
     * @param array 查询的条件array<br/>如<i>array(col_a=>111)</i>
     * @param array 集合过滤器array<br/>完整的样子想这个:<i>array(sort=>array(col_a=>1,col_b=>-1), skip=>100, limit=>10, timeout=>5000, immortal=>true)</i>,这表示:
     * <ol>
     * <li>wrapped 以wrapped为封装为数组的键,默认按数组先后顺序</li>
     * <li>_id,默认不返回数据带有MongoID字段,如果指定了返回列的话也是一样的效果</li>
     * <li>sort 以col_a为ASC,col_b为DESC排序,可以多列组合</li>
     * <li>skip 表示从101条记录开始取数据,即跳过了前100条</li>
     * <li>limit 本次选取的条数</li>
     * <li>timeout 表示等待响应的时间(暂不使用)</li>
     * <li>immortal 表示是否维持链接永久有效,默认true,此时timeout失效(暂不使用)</li>
     * </ol>
     * @param array 需要返回的字段(通常只返回必要的字段可以加快响应速度)
     * @return mixed 查询的结果
     */
    public function find($coll_name, $condition=array(), $result_filter=array(wrapped=>'', with_objectId=>0, timeout=>5000, immortal=>true), $ret_fields = array() ) {
        $db_name = $this->db_name;
        $cursor = $this->mongo->$db_name->$coll_name->find($condition, $ret_fields);
        if ( !empty($result_filter['skip'])){
            $cursor->skip($result_filter['skip']);
        }
        if ( !empty($result_filter['limit'])){
            $cursor->limit($result_filter['limit']);
        }
        if ( !empty($result_filter['sort'])){
            $cursor->sort($result_filter['sort']);
        }
        if ( !empty($result_filter['wrapped'])){
            $wrapped = $result_filter['wrapped'];
        }
        if ( $result_filter['with_objectId']==1){ //如果指定了返回的列此项目就失效
            $with_objectId = count($ret_fields) < 1;
        }
        $result = array();
        $this->cursor = $cursor;
        try{
            if ( $wrapped == '_id'){
                while($ret = $cursor->getNext()){
                    $result[$ret['_id']->{'$id'}] = $ret;
                }
            } else if (strlen ($wrapped) ) {
                while($ret=$cursor->getNext()){
                    $result[$ret[$wrapped]] = $ret;
                }
            } else {
                while($ret=$cursor->getNext()){
                    $result[] = $ret;
                }
            }
            if ( !$with_objectId ){
                foreach($result as $key=>$v){
                    unset($result[$key]['_id']);
                }
            }
        } catch (Exception $ex) {
            $this->errors = $ex->getMessage();
        }
        return $result;
    }
    
    /**
     * 根据ID查询一条记录
     * @param string 集合名
     * @param string MongoId
     * @param mixed 指定返回的列,默认返回所有列
     * @return mixed 结果
     */
    public function find_by_objectId($coll_name, $_id, $ret_fields=array()){
        $db_name = $this->db_name;
        return $this->mongo->$db_name->$coll_name->findOne(array('_id'=>( new MongoId($_id))), $ret_fields);
    }

    /**
     * 查询一条记录
     * @param string 集合名
     * @param array 查询条件
     * @param array 需要返回的字段
     * @return array 查询的结果
     */
    public function find_one($coll_name, $condition=array(), $fields = array('_id'=>0)) {
        $db_name = $this->db_name;
        if ( is_string($condition['_id'])){
            $condition['_id'] = new MongoId($condition['_id']);
        }
        return $this->mongo->$db_name->$coll_name->findOne($condition, $fields);
    }
    
    /**
     * 计算集合内指定条件文档的数量
     * @param string 集合名
     * @param array 查询的条件
     * @param int 指定返回结果数量的上限
     * @param int 统计前跳过的结果数量
     * @return int 集合的数量
     */
    public function count($coll_name, $condition=array(), $limit=0, $skip=0){
        $db_name = $this->db_name;
        return $this->mongo->$db_name->$coll_name->count($condition, $limit, $skip);
    }
}

 或许你看到了Config.php,其实他貌似长成这个样子:

 <?php

final class Config {

    /**
     * Memcache 配置
     * @var mixed Memcache 配置
     */
    public static $MEMCACHE_SERVER = array(
        hosts => array(
            array(
                host => '127.0.0.1',
                port => 11211,
                weight => 100
            )
        ),
        threshold => 30000,
        saving => 0.2
    );

    /**
     * MongoDB 配置
     * @var mixed  MongoDB 配置 
     */
    public static $MONGO_SERVER = array(
        hosts => array(
            array(ip => '127.0.0.1', port => 27017, username => 'admin', password => 'admin', is_master => true)
//            ,array(ip => '127.0.0.1', port => 27018, username => 'admin', password => 'admin', is_master => true)
        )
    );

    /**
     * MySQL 配置
     * @var mixed MySQL 配置
     */
    public static $MYSQL_SERVER = array(
        host=>'127.0.0.1',
        user=>'root',
        password=>'123456',
        port=>3306
    );
}
?>

 

分享到:
评论

相关推荐

    php封装的mongodb操作类.zip

    本文将详细介绍一个基于PHP封装的MongoDB操作类,帮助开发者更高效地利用MongoDB。 首先,这个“php封装的mongodb操作类”是为了解决PHP与MongoDB之间的交互问题,提供一套便捷的API,使得开发人员无需深入了解...

    c#mongodb封装sqlserver封装组件长期稳定使用

    一直稳定在用的数据库封装,使用极其简洁,查询结果转换为类不需要列出每个字段。内含范例网站。public class MongoOper { protected MongoClient m_client; protected IMongoDatabase m_db; protected ...

    node.js封装的一个MongoDB操作类库

    基于node封装的一个MongoDB操作类库 包括增删改查 分页查询 批量操作 采用单例模式大大提高性能 使用时需新建一个config.js配置数据库地址 数据库名称 const Config ={ url:'数据库地址', dbName:'数据库' } ...

    java-mongodb底层封装

    在Java开发中,MongoDB是一个常用的NoSQL数据库,以其灵活性、高性能和易扩展性而备受青睐。本项目针对MongoDB进行了底层封装,旨在提供一套简洁、高效的API,使得开发人员可以更加便捷地进行数据的增删查改操作,...

    php操作mongodb封装类与用法实例

    近来学习了mongodb,刚好是做php开发的,随便写了php操作mongodb的封装类. &lt;?php /** * Created by PhpStorm. * User: lee * Date: 2016/10/24 * Time: 13:49 */ namespace App\Http\Controllers\Api; use ...

    PHP操作Mongodb封装类完整实例

    本文实例讲述了PHP操作Mongodb封装类。分享给大家供大家参考,具体如下: &lt;?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该版本API实现了 ...

    mongodb操作封装类

    在您提供的"mongodb操作封装类"中,很显然,开发者已经创建了一个C#类库,用于简化对MongoDB的操作,便于在WPF应用程序中使用。 该"wpfMongoDbCsharp"项目可能是包含以下关键组件的: 1. **MongoDB.Driver**:这是...

    php Mongodb 操作类

    这个"php Mongodb操作类"可能是对`mongodb`扩展的一个封装,它可能包含以下核心功能: - 连接:建立到MongoDB服务器的连接,可能包括设置主机名、端口、数据库名称和认证信息。 - 集合操作:选择或创建集合,相当...

    mongoDB DAO层封装

    MongoDB DAO层封装是数据库操作的重要一环,它在应用程序与数据库之间建立了一层抽象,使得数据访问更加简便和高效。在这个项目中,我们主要基于MongoDB 3.0版本和Spring Data 1.5进行整合,实现了DAO层的封装。下面...

    Redis/MongoDB 接口封装(C++)

    构造一个 Redis 缓存层 + MongoDB 持久层的后台 Server 架构 并通过简单方便的接口供上层程序员使用,具体的数据分层处理对上层程序员是黑盒的 8. 设计并开发整套缓存层使用的 KEY 规则,方便缓存更新 结合公司的...

    mongodb的odm封装

    以下是对“mongodb的odm封装”这一主题的详细解释: 1. **ODM基本概念**: - **对象-文档映射(Object-Document Mapping)**:类似于关系型数据库中的ORM(Object-Relational Mapping),ODM是一种将数据模型转换...

    spring-data使用mongodbTemplate对MongoDB进行读写操作

    Spring Data MongoDB是一个强大的Java库,它为开发人员提供了一种简单的方式来访问和操作MongoDB数据库。这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDB...

    整合了一套crud代码,减少sql查询,封装mysql和mongodb等操作

    整合了一套crud代码,减少sql查询,封装mysql和mongodb等操作 参数说明https://mp.csdn.net/mp_download/manage/download/UpDetailed

    php windows下安装mongodb服务

    - 编写一个简单的PHP脚本来连接MongoDB并执行查询,通过浏览器访问以测试连接是否正常。 - 如果遇到问题,检查PHP错误日志和MongoDB的日志文件,它们通常会提供关于问题的线索。 通过以上步骤,你就可以在Windows...

    PHP操作MONGODB详细文档 WORD版

    MongoDB是一个高性能、开源、无模式的分布式文档型数据库,它以其灵活性和可扩展性受到青睐。而PHP作为服务器端脚本语言,因其易学易用性而广受欢迎,因此将PHP与MongoDB结合,可以构建高效的数据驱动应用。 本文档...

    Python-基于ER模型Flask封装对MongoDB的增删改查

    例如,如果我们的ER模型包含“用户”实体,那么在MongoDB中可能有一个名为"users"的集合,每个文档代表一个用户,包含如"name"、"email"和"password"等字段。 接下来,我们使用Flask创建API。Flask提供了一个简单的...

    mongodb 副本集php文件样例,php连接mongodb

    mongodb 副本集php文件样例,php连接mongodb

    php MongoDB for CI

    "php MongoDB for CI" 是一个针对CI框架的MongoDB扩展,它提供了一种简单且高效的方式来操作MongoDB数据库。 首先,MongoDB是一个流行的开源NoSQL数据库系统,它支持非结构化数据,如文档、集合和图形数据。与传统...

    php封装的mongodb操作类代码

    标题中的"php封装的mongodb操作类代码"指的是在PHP中为MongoDB数据库创建的一个自定义类,用于简化和封装MongoDB的操作。这个类通常会包含连接数据库、执行查询、插入数据、更新数据以及删除数据等常见操作的方法。...

Global site tag (gtag.js) - Google Analytics