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

  

  注意注意

  find()返回的是当前对象

  toArray()方法是把当前对象转换为数组

  getCursor()方法是把当前对象转换为MongoCursor Object(游标对象)