mongo Table类文件 获取MongoCursor(游标)的实现方法分析


Posted in PHP onJuly 01, 2013

MongoCursor Object
游标类

Mongo
Config.php配置文件
Table.php(mongodb操作数据库类文件)

Config.php配置文件

<?php
require_once 'Zend/Exception.php';
class Hrs_Mongo_Config
{
    const VERSION = '1.7.0';
    const DEFAULT_HOST = 'localhost';
    const DEFAULT_PORT = 27017;
    private static $host = self::DEFAULT_HOST ;
    private static $port = self::DEFAULT_PORT ;
    private static $options = array(
            'connect' => true,
            'timeout' => 30,
            //'replicaSet' => '' //If this is given, the master will be determined by using the ismaster database command on the seeds
    );
    public static $conn = '';
    public static $defaultDb = '';
    public static $linkStatus = '';
    public static function set($server = 'mongodb://localhost:27017', $options = array('connect' => true)) {
        if(!$server){
            $url = 'mongodb://'.self::$host.':'.self::$port;
        }
        if(is_array($server)){
            if(isset($server['host'])){
                self::$host = $server['host'];
            }
            if(isset($server['port'])){
                self::$port = $server['port'];
            }
            if(isset($server['user']) && isset($server['pass'])){
                $url = 'mongodb://'.$server['user'].':'.$server['pass'].'@'.self::$host.':'.self::$port;
            }else{
                $url = 'mongodb://'.self::$host.':'.self::$port;
            }
        }
        if(is_array($options)){
            foreach (self::$options as $o_k=>$o_v){
                if(isset($options[$o_k]))
                    self::$options[$o_k] = $o_v;
            }
        }
        try{                        
            self::$conn = new Mongo($url, self::$options);
            self::$linkStatus = 'success';
        }catch (Exception $e){
            self::$linkStatus = 'failed';
        }
        if(isset($server['database'])){
            self::selectDB($server['database']);
        }
    }
    public static function selectDB($database){
        if($database){
            try {
                if(self::$linkStatus=='success')
                    self::$defaultDb = self::$conn->selectDB($database);
                return self::$defaultDb;
            }
            catch(InvalidArgumentException $e) {
                throw new Zend_Exception('Mongodb数据库名称不正确');
            }
        }else{
            throw new Zend_Exception('Mongodb数据库名称不能为空');
        }
    }
}

Table.php(mongodb操作数据库类文件)
<?php
require_once 'Hrs/Mongo/Config.php';
abstract class Hrs_Mongo_Table
{
    protected $_db = '';
    protected $_name = '';
    protected $_data = array();
    protected $c_options = array(
            'fsync'=>true,
            'safe'=>true
    );
    protected $u_options = array(
    //'upsert'=>false,
            'multiple'=>true,
            'fsync'=>true,
            'safe'=>true
    );
    /*
     protected $r_options = array(
     );*/
    protected $d_options = array(
            'fsync'=>true,
            'justOne'=>false,
            'safe'=>true
    );
    protected function _setAdapter($database=''){
        if(!$database)
            throw new Zend_Exception('Mongodb数据库名称不能为空');
        Hrs_Mongo_Config::selectDB($database);
    }
    public function __construct() {
        if(Hrs_Mongo_Config::$conn instanceof Mongo){
            $name = $this->_name;
            $defDb = Hrs_Mongo_Config::$defaultDb;
            $this->_db = $defDb->$name;
        }else{
            throw new Zend_Exception('Mongodb服务器连接失败');
        }
    }
    public function insert($data){
        if(!$this->testLink()) return false;
        $ret = $this->_db->insert($data, $this->c_options);
        return $ret;
    }
    public function update($data, $where){
        if(!$this->testLink()) return false;
        return $this->_db->update($where, $data, $this->u_options);
    }
    public function find($where=array(),$limit=0){
        if($this->testLink()) {
            if($limit>0){
                $this->_data = $where ? $this->_db->find($where)->limit($limit)->snapshot() : $this->_db->find()->limit($limit)->snapshot();
            }else{
                $this->_data = $where ? $this->_db->find($where)->limit($limit)->snapshot() : $this->_db->find()->limit($limit)->snapshot();
            }
        }
        return $this;
    }
    //find cursor
    /*
     * 获取游标对象
     */
    public function look($where=array(),$fields=array()){
        if($this->testLink()) {
            if($fields){
                return $where ? $this->_db->find($where,$fields): $this->_db->find()->fields($fields);
            }else{
                return $where ? $this->_db->find($where) : $this->_db->find();
            }
        }
        return false;
    }
    public function delete($where){
        if(!$this->testLink()) return false;
        return $this->_db->remove($where, $this->d_options);
    }
    public function dropMe(){
        if(!$this->testLink()) return false;
        return $this->_db->drop();
    }
    public function __toString(){
        return $this->_data;
    }
    public function toArray(){
        $tmpData = array();
        foreach($this->_data as $id=>$row){
            $one_row = array();
            foreach($row as $key=>$col){
                $one_row[$key] = $col;
            }
            $one_row['_id'] = $id;
            $tmpData[] = $one_row;
        }
        return $tmpData;
    }
    protected function testLink(){
        return Hrs_Mongo_Config::$linkStatus == 'success' ? true :false;
    }
}

要点注意!!!
第一种方法
    //find cursor
    /*
     * 获取游标对象
     */
    public function look($where=array(),$fields=array()){
        if($this->testLink()) {
            if($fields){
                return $where ? $this->_db->find($where,$fields): $this->_db->find()->fields($fields);
            }else{
                return $where ? $this->_db->find($where) : $this->_db->find();
            }
        }
        return false;
    }

第二种方法
    public function find($where=array(),$field=array()){
        if($this->testLink()) {
            $this->_data = $this->_db->find($where,$field)->sort(array("_id" => -1));
        }
        return $this;
    }

    /*
     * 获取游标对象
     */
    public function getCursor(){
     return $this->_data;
    }

第二种需要的是find得到的不是数组
find($where)->getCursor();是MongoCursor Object

注意注意
find()返回的是当前对象
toArray()方法是把当前对象转换为数组
getCursor()方法是把当前对象转换为MongoCursor Object(游标对象)
PHP 相关文章推荐
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
简单的cookie计数器实现源码
Jun 07 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
Jun 09 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
PHP数组和explode函数示例总结
May 08 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
Dec 31 PHP
phpstudy2020搭建站点的实现示例
Oct 30 PHP
php5.3 注意事项说明
Jul 01 #PHP
file_get_contents(&quot;php://input&quot;, &quot;r&quot;)实例介绍
Jul 01 #PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 #PHP
解析php做推送服务端实现ios消息推送
Jul 01 #PHP
php ios推送(代码)
Jul 01 #PHP
PHP分页效率终结版(推荐)
Jul 01 #PHP
解析php防止form重复提交的方法
Jul 01 #PHP
You might like
php实现用户在线时间统计详解
2011/10/08 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
webpack踩坑之路图片的路径与打包
2017/09/05 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
js字符串类型String常用操作实例总结
2019/07/05 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
教师自我评价范例
2013/09/24 职场文书
缴纳养老保险的证明
2014/01/10 职场文书
高一新生军训方案
2014/05/12 职场文书
学生吸烟检讨书
2014/09/14 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS