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

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

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