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

前端技术 2023/09/02 PHP
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(游标对象)

本文地址:https://www.stayed.cn/item/3425

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。