gpt4 book ai didi

高效mongodb的php分页类(不使用skip)

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章高效mongodb的php分页类(不使用skip)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

mongodb分页skip+limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低.

如果能够通过查询条件查出每页结果的最后一条记录,在用最后一条记录作为查询条件去查下一页,这样每次都查询页面size条记录,效率不会差.

具体代码如下:包含mongodb.class.php, page.class.php, test.php 。

mongodb.class.php mongodb 操作类 。

复制代码 代码如下:

<?php function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') {         echo $message, $status_code,PHP_EOL;         exit; } 。

  。

//MongoDB操作类 class DB { 。

 private $CI;  private $config_file = 'MongoDB',

 private $connection;  private $db;  private $connection_string;  private $collection = '';  private $host;  private $port;  private $user;  private $pass;  private $dbname;  private $key;  private $persist;  private $persist_key,

 private $selects = array();  private $wheres = array();  private $sorts = array();  private $page_sorts = array(),

 private $limit = 999999;  private $offset = 0;   。

 /**   * --------------------------------------------------------------------------------   * CONSTRUCTOR   * --------------------------------------------------------------------------------   *   * Automatically check if the Mongo PECL extension has been installed/enabled.   * Generate the connection string and establish a connection to the MongoDB.   */ 。

 public function __construct($MONGODB_CONFIG)  {   if(!class_exists('Mongo'))   {    show_error("The MongoDB PECL extension has not been installed or enabled", 500);   }   /**         $config['mongo_host'] = '221.234.43.144';         $config['mongo_port'] = 27017;         $config['mongo_db'] = 'test';         $config['mongo_user'] = '';         $config['mongo_pass'] = '';         $config['mongo_persist'] = TRUE;          *          */   $this->connection_string($MONGODB_CONFIG);   $this->connect();  }   。

 /**   * --------------------------------------------------------------------------------   * Switch_db   * --------------------------------------------------------------------------------   *   * Switch from default database to a different db   */ 。

 public function switch_db($database = '')  {   if(empty($database))   {    show_error("To switch MongoDB databases, a new database name must be specified", 500);   }   $this->dbname = $database;   try   {    $this->db = $this->connection->{$this->dbname};    return(TRUE);   }   catch(Exception $e)   {    show_error("Unable to switch Mongo Databases: {$e->getMessage()}", 500);   }  } 。

 /**   * --------------------------------------------------------------------------------   * SELECT FIELDS   * --------------------------------------------------------------------------------   *   * Determine which fields to include OR which to exclude during the query process.   * Currently, including and excluding at the same time is not available, so the   * $includes array will take precedence over the $excludes array.  If you want to   * only choose fields to exclude, leave $includes an empty array().   *   * @usage: $this->mongo_db->select(array('foo', 'bar'))->get('foobar');   */ 。

 public function select($includes = array(), $excludes = array())  {    if(!is_array($includes))    {     $includes = array();    } 。

   if(!is_array($excludes))    {     $excludes = array();    } 。

   if(!empty($includes))    {     foreach($includes as $col)     {      $this->selects[$col] = 1;     }    }    else    {     foreach($excludes as $col)     {      $this->selects[$col] = 0;     }    }    return($this);  } 。

 /**   * --------------------------------------------------------------------------------   * WHERE PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents based on these search parameters.  The $wheres array should   * be an associative array with the field as the key and the value as the search   * criteria.   *   * @usage = $this->mongo_db->where(array('foo' => 'bar'))->get('foobar');   */ 。

  public function where($wheres = array())   {    foreach($wheres as $wh => $val)    {     $this->wheres[$wh] = $val;    }    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE_IN PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is in a given $in array().   *   * @usage = $this->mongo_db->where_in('foo', array('bar', 'zoo', 'blah'))->get('foobar');   */ 。

  public function where_in($field = "", $in = array())   {    $this->where_init($field);    $this->wheres[$field]['$in'] = $in;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE_NOT_IN PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is not in a given $in array().   *   * @usage = $this->mongo_db->where_not_in('foo', array('bar', 'zoo', 'blah'))->get('foobar');   */ 。

  public function where_not_in($field = "", $in = array())   {    $this->where_init($field);    $this->wheres[$field]['$nin'] = $in;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE GREATER THAN PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is greater than $x   *   * @usage = $this->mongo_db->where_gt('foo', 20);   */ 。

  public function where_gt($field = "", $x)   {    $this->where_init($field);    $this->wheres[$field]['$gt'] = $x;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE GREATER THAN OR EQUAL TO PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is greater than or equal to $x   *   * @usage = $this->mongo_db->where_gte('foo', 20);   */ 。

  public function where_gte($field = "", $x)   {    $this->where_init($field);    $this->wheres[$field]['$gte'] = $x;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE LESS THAN PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is less than $x   *   * @usage = $this->mongo_db->where_lt('foo', 20);   */ 。

  public function where_lt($field = "", $x)   {    $this->where_init($field);    $this->wheres[$field]['$lt'] = $x;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE LESS THAN OR EQUAL TO PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is less than or equal to $x   *   * @usage = $this->mongo_db->where_lte('foo', 20);   */ 。

  public function where_lte($field = "", $x)   {    $this->where_init($field);    $this->wheres[$field]['$lte'] = $x;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE BETWEEN PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is between $x and $y   *   * @usage = $this->mongo_db->where_between('foo', 20, 30);   */ 。

  public function where_between($field = "", $x, $y)   {    $this->where_init($field);    $this->wheres[$field]['$gte'] = $x;    $this->wheres[$field]['$lte'] = $y;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE BETWEEN AND NOT EQUAL TO PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is between but not equal to $x and $y   *   * @usage = $this->mongo_db->where_between_ne('foo', 20, 30);   */ 。

  public function where_between_ne($field = "", $x, $y)   {    $this->where_init($field);    $this->wheres[$field]['$gt'] = $x;    $this->wheres[$field]['$lt'] = $y;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE NOT EQUAL TO PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is not equal to $x   *   * @usage = $this->mongo_db->where_between('foo', 20, 30);   */ 。

  public function where_ne($field = "", $x)   {    $this->where_init($field);    $this->wheres[$field]['$ne'] = $x;    return($this);   } 。

  /**   * --------------------------------------------------------------------------------   * WHERE OR   * --------------------------------------------------------------------------------   *   * Get the documents where the value of a $field is in one or more values   *   * @usage = $this->mongo_db->where_or('foo', array( 'foo', 'bar', 'blegh' );   */ 。

  public function where_or($field = "", $values)   {    $this->where_init($field);    $this->wheres[$field]['$or'] = $values;    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * WHERE AND   * --------------------------------------------------------------------------------   *   * Get the documents where the elements match the specified values   *   * @usage = $this->mongo_db->where_and( array ( 'foo' => 1, 'b' => 'someexample' );   */ 。

  public function where_and( $elements_values = array() ) {    foreach ( $elements_values as $element => $val ) {     $this->wheres[$element] = $val;    }    return($this);   } 。

  /**   * --------------------------------------------------------------------------------   * WHERE MOD   * --------------------------------------------------------------------------------   *   * Get the documents where $field % $mod = $result   *   * @usage = $this->mongo_db->where_mod( 'foo', 10, 1 );   */ 。

  public function where_mod( $field, $num, $result ) {    $this->where_init($field);    $this->wheres[$field]['$mod'] = array ( $num, $result );    return($this);   } 。

 /**  * --------------------------------------------------------------------------------  * Where size  * --------------------------------------------------------------------------------  *  * Get the documents where the size of a field is in a given $size int  *  * @usage : $this->mongo_db->where_size('foo', 1)->get('foobar');  */ 。

 public function where_size($field = "", $size = "")  {   $this->_where_init($field);   $this->wheres[$field]['$size'] = $size;   return ($this);  } 。

 /**   * --------------------------------------------------------------------------------   * LIKE PARAMETERS   * --------------------------------------------------------------------------------   *   * Get the documents where the (string) value of a $field is like a value. The defaults   * allow for a case-insensitive search.   *   * @param $flags   * Allows for the typical regular expression flags:   *  i = case insensitive   *  m = multiline   *  x = can contain comments   *  l = locale   *  s = dotall, "." matches everything, including newlines   *  u = match unicode   *   * @param $enable_start_wildcard   * If set to anything other than TRUE, a starting line character "^" will be prepended   * to the search value, representing only searching for a value at the start of   * a new line.   *   * @param $enable_end_wildcard   * If set to anything other than TRUE, an ending line character "$" will be appended   * to the search value, representing only searching for a value at the end of   * a line.   *   * @usage = $this->mongo_db->like('foo', 'bar', 'im', FALSE, TRUE);   */ 。

  public function like($field = "", $value = "", $flags = "i", $enable_start_wildcard = TRUE, $enable_end_wildcard = TRUE)   {    $field = (string) trim($field);    $this->where_init($field);    $value = (string) trim($value);    $value = quotemeta($value),

   if($enable_start_wildcard !== TRUE)    {     $value = "^" . $value;    } 。

   if($enable_end_wildcard !== TRUE)    {     $value .= "$";    } 。

   $regex = "/$value/$flags";    $this->wheres[$field] = new MongoRegex($regex);    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * ORDER BY PARAMETERS   * --------------------------------------------------------------------------------   *   * Sort the documents based on the parameters passed. To set values to descending order,   * you must pass values of either -1, FALSE, 'desc', or 'DESC', else they will be   * set to 1 (ASC).   *   * @usage = $this->mongo_db->where_between('foo', 20, 30);   */ 。

  public function order_by($fields = array())   {    foreach($fields as $col => $val)    {     if($val == -1 || $val === FALSE || strtolower($val) == 'desc')     {      $this->sorts[$col] = -1;     }     else     {      $this->sorts[$col] = 1;     }    }    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * LIMIT DOCUMENTS   * --------------------------------------------------------------------------------   *   * Limit the result set to $x number of documents   *   * @usage = $this->mongo_db->limit($x);   */ 。

  public function limit($x = 99999) {    if($x !== NULL && is_numeric($x) && $x >= 1)    {     $this->limit = (int) $x;    }    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * OFFSET DOCUMENTS   * --------------------------------------------------------------------------------   *   * Offset the result set to skip $x number of documents   *   * @usage = $this->mongo_db->offset($x);   */ 。

  public function offset($x = 0)   {    if($x !== NULL && is_numeric($x) && $x >= 1)    {     $this->offset = (int) $x;    }    return($this);   } 。

 /**   * --------------------------------------------------------------------------------   * GET_WHERE   * --------------------------------------------------------------------------------   *   * Get the documents based upon the passed parameters   *   * @usage = $this->mongo_db->get_where('foo', array('bar' => 'something'));   */ 。

  public function get_where($collection = "", $where = array(), $limit = 99999)   {    return($this->where($where)->limit($limit)->get($collection));   } 。

 /**   * --------------------------------------------------------------------------------   * GET   * --------------------------------------------------------------------------------   *   * Get the documents based upon the passed parameters   *   * @usage = $this->mongo_db->get('foo', array('bar' => 'something'));   */ 。

  public function get($collection = "")   {    if(empty($collection))    {     show_error("In order to retreive documents from MongoDB, a collection name must be passed", 500);    }    $results = array();    $documents = $this->db->{$collection}->find($this->wheres, $this->selects)->limit((int) $this->limit)->skip((int) $this->offset)->sort($this->sorts),

   $returns = array(),

   foreach($documents as $doc):     $returns[] = $doc;    endforeach;   $this->clear();    return($returns),

  } 。

 /**   * --------------------------------------------------------------------------------   * COUNT   * --------------------------------------------------------------------------------   *   * Count the documents based upon the passed parameters   *   * @usage = $this->mongo_db->get('foo');   */ 。

  public function count($collection = "")   {    if(empty($collection))    {     show_error("In order to retreive a count of documents from MongoDB, a collection name must be passed", 500);    }    $count = $this->db->{$collection}->find($this->wheres)->limit((int) $this->limit)->skip((int) $this->offset)->count();    $this->clear();    return($count);   }  /**   * 自增ID实现   * return insert_id   */  private function insert_inc($table)  {   $update = array('$inc'=>array('id'=>1));   $query = array('table'=>$table);   $command = array(   'findandmodify'=>'_increase',   'update'=>$update,   'query'=>$query,   'new'=>true,   'upsert'=>true   );   $id = $this->db->command($command);   return $id['value']['id'];  }  /**   * --------------------------------------------------------------------------------   * INSERT   * --------------------------------------------------------------------------------   *   * Insert a new document into the passed collection   *   * @usage = $this->mongo_db->insert('foo', $data = array());   */ 。

  public function insert($collection = "", $data = array()) {    if(empty($collection))    {     show_error("No Mongo collection selected to insert into", 500);    } 。

   if(count($data) == 0 || !is_array($data))    {     show_error("Nothing to insert into Mongo collection or insert is not an array", 500);    } 。

   try    {    $inc = $this->insert_inc($collection);    $data['_id'] = $inc;     $result = $this->db->{$collection}->insert($data, array('fsync' => TRUE));     if($result['ok'] || $result){     return true;    }    else{     return false;    }    }    catch(MongoCursorException $e)    {     show_error("Insert of data into MongoDB failed: {$e->getMessage()}", 500);    } 。

  } 。

 /**   * --------------------------------------------------------------------------------   * UPDATE   * --------------------------------------------------------------------------------   *   * Update a document into the passed collection   *   * @usage = $this->mongo_db->update('foo', $data = array());   */ 。

  public function update($collection = "", $data = array(), $flage = false)   {    if(empty($collection))    {     show_error("No Mongo collection selected to update", 500);   }    if(count($data) == 0 || !is_array($data))    {     show_error("Nothing to update in Mongo collection or update is not an array", 500);   }   unset($data['_id']);   if($flage){    $arr = $this->wheres;    unset($arr['_id']);    if(is_array($arr)){     foreach($arr as $key => $w){      unset($data[$key]);     }    }   }   try    {     $res = $this->db->{$collection}->update($this->wheres, array('$set' => $data), array('fsync' => TRUE, 'multiple' => FALSE));    $this->clear();    return $res;    }     catch(MongoCursorException $e)    {     show_error("Update of data into MongoDB failed: {$e->getMessage()}", 500);    } 。

  } 。

 /**   * --------------------------------------------------------------------------------   * UPDATE_ALL   * --------------------------------------------------------------------------------   *   * Insert a new document into the passed collection   *   * @usage = $this->mongo_db->update_all('foo', $data = array());   */ 。

  public function update_all($collection = "", $data = array()) {    if(empty($collection))    {     show_error("No Mongo collection selected to update", 500);    } 。

   if(count($data) == 0 || !is_array($data))    {     show_error("Nothing to update in Mongo collection or update is not an array", 500);    } 。

   try    {     $this->db->{$collection}->update($this->wheres, array('$set' => $data), array('fsync' => TRUE, 'multiple' => TRUE));    $this->clear();     return(TRUE);    }    catch(MongoCursorException $e)    {     show_error("Update of data into MongoDB failed: {$e->getMessage()}", 500);    } 。

  } 。

  /**   * --------------------------------------------------------------------------------   * DELETE   * --------------------------------------------------------------------------------   *   * delete document from the passed collection based upon certain criteria   *   * @usage = $this->mongo_db->delete('foo', $data = array());   */ 。

  public function delete($collection, $where)   {    if(empty($collection))    {     show_error("No Mongo collection selected to delete from", 500);    }   if(!$where){    show_error("No data input to delete", 500);   }    try    {    $this->wheres = $where;     $this->db->{$collection}->remove($this->wheres);    $this->clear();     return(TRUE);    }    catch(MongoCursorException $e)    {     show_error("Delete of data into MongoDB failed: {$e->getMessage()}", 500);    } 。

  } 。

 /**   * --------------------------------------------------------------------------------   * DELETE_ALL   * --------------------------------------------------------------------------------   *   * Delete all documents from the passed collection based upon certain criteria   *   * @usage = $this->mongo_db->delete_all('foo', $data = array());   */ 。

  public function delete_all($collection = "")   {      if(empty($collection))      {       show_error("No Mongo collection selected to delete from", 500);     } 。

   try    {     $this->db->{$collection}->remove($this->wheres, array('fsync' => TRUE, 'justOne' => FALSE));    $this->clear();     return(TRUE);    }    catch(MongoCursorException $e)    {     show_error("Delete of data into MongoDB failed: {$e->getMessage()}", 500);    } 。

  } 。

 /**   * --------------------------------------------------------------------------------   * ADD_INDEX   * --------------------------------------------------------------------------------   *   * Ensure an index of the keys in a collection with optional parameters. To set values to descending order,   * you must pass values of either -1, FALSE, 'desc', or 'DESC', else they will be   * set to 1 (ASC).   *   * @usage = $this->mongo_db->add_index($collection, array('first_name' => 'ASC', 'last_name' => -1), array('unique' => TRUE));   */ 。

 public function add_index($collection = "", $keys = array(), $options = array())  {   if(empty($collection))   {     show_error("No Mongo collection specified to add index to", 500);    } 。

   if(empty($keys) || !is_array($keys))    {     show_error("Index could not be created to MongoDB Collection because no keys were specified", 500);     }    foreach($keys as $col => $val)    {     if($val == -1 || $val === FALSE || strtolower($val) == 'desc')     {      $keys[$col] = -1;     }     else     {      $keys[$col] = 1;     }    } 。

   if($this->db->{$collection}->ensureIndex($keys, $options) == TRUE)    {     $this->clear();     return($this);    }    else    {     show_error("An error occured when trying to add an index to MongoDB Collection", 500);   }  } 。

  。

 /**   * --------------------------------------------------------------------------------   * REMOVE_INDEX   * --------------------------------------------------------------------------------   *   * Remove an index of the keys in a collection. To set values to descending order,   * you must pass values of either -1, FALSE, 'desc', or 'DESC', else they will be   * set to 1 (ASC).   *   * @usage = $this->mongo_db->remove_index($collection, array('first_name' => 'ASC', 'last_name' => -1));   */ 。

 public function remove_index($collection = "", $keys = array())  {   if(empty($collection))   {     show_error("No Mongo collection specified to remove index from", 500);    } 。

   if(empty($keys) || !is_array($keys))    {     show_error("Index could not be removed from MongoDB Collection because no keys were specified", 500);    } 。

   if($this->db->{$collection}->deleteIndex($keys, $options) == TRUE)    {     $this->clear();     return($this);    }    else    {     show_error("An error occured when trying to remove an index from MongoDB Collection", 500);   }  } 。

 /**   * --------------------------------------------------------------------------------   * REMOVE_ALL_INDEXES   * --------------------------------------------------------------------------------   *   * Remove all indexes from a collection.   *   * @usage = $this->mongo_db->remove_all_index($collection);   */ 。

 public function remove_all_indexes($collection = "") {   if(empty($collection))   {     show_error("No Mongo collection specified to remove all indexes from", 500);    } 。

   $this->db->{$collection}->deleteIndexes();    $this->clear();    return($this);  } 。

 /**   * --------------------------------------------------------------------------------   * LIST_INDEXES   * --------------------------------------------------------------------------------   *   * Lists all indexes in a collection.   *   * @usage = $this->mongo_db->list_indexes($collection);   */  public function list_indexes($collection = "") {   if(empty($collection))   {     show_error("No Mongo collection specified to remove all indexes from", 500);    }    return($this->db->{$collection}->getIndexInfo());  } 。

 /**   * --------------------------------------------------------------------------------   * DROP COLLECTION   * --------------------------------------------------------------------------------   *   * Removes the specified collection from the database.  Be careful because this   *  can have some very large issues in production!   */ 。

  public function drop_collection($collection = "")   {     if(empty($collection))    {       show_error("No Mongo collection specified to drop from database", 500);     }     $this->db->{$collection}->drop();     return TRUE;   } 。

 /**   * --------------------------------------------------------------------------------   * CONNECT TO MONGODB   * --------------------------------------------------------------------------------   *   * Establish a connection to MongoDB using the connection string generated in   * the connection_string() method.  If 'mongo_persist_key' was set to true in the   * config file, establish a persistent connection.  We allow for only the 'persist'   * option to be set because we want to establish a connection immediately.   */ 。

 private function connect() {   $options = array();   if($this->persist === TRUE)   {    $options['persist'] = isset($this->persist_key) && !empty($this->persist_key) ? $this->persist_key : 'ci_mongo_persist';   } 。

  try   {    $this->connection = new Mongo($this->connection_string, $options);    $this->db = $this->connection->{$this->dbname};    return($this);   }   catch(MongoConnectionException $e)   {    show_error("Unable to connect to MongoDB: {$e->getMessage()}", 500);   }  } 。

 /**   * --------------------------------------------------------------------------------   * BUILD CONNECTION STRING   * --------------------------------------------------------------------------------   *   * Build the connection string from the config file.   */ 。

 private function connection_string($MONGODB_CONFIG)  { 。

  $this->host = trim($MONGODB_CONFIG['HOST']);   $this->port = trim($MONGODB_CONFIG['PORT']);   $this->user = trim($MONGODB_CONFIG['USER']);   $this->pass = trim($MONGODB_CONFIG['PWD']);   $this->dbname = trim($MONGODB_CONFIG['DATABASE']);   $this->persist = trim($MONGODB_CONFIG['PERSIST']);   $this->persist_key = trim($MONGODB_CONFIG['PERSIST_KEY']),

  $connection_string = "mongodb://",

  if(empty($this->host))   {    show_error("The Host must be set to connect to MongoDB", 500);   } 。

  if(empty($this->dbname))   {    show_error("The Database must be set to connect to MongoDB", 500);   } 。

  if(!empty($this->user) && !empty($this->pass))   {    $connection_string .= "{$this->user}:{$this->pass}@";   } 。

  if(isset($this->port) && !empty($this->port))   {    $connection_string .= "{$this->host}:{$this->port}/{$this->dbname}";   }   else   {    $connection_string .= "{$this->host}";   } 。

  $this->connection_string = trim($connection_string);  } 。

 /**   * --------------------------------------------------------------------------------   * CLEAR   * --------------------------------------------------------------------------------   *   * Resets the class variables to default settings   */ 。

 private function clear()  {   $this->selects = array();   $this->wheres = array();   $this->limit = NULL;   $this->offset = NULL;   $this->sorts = array();  } 。

 /**   * --------------------------------------------------------------------------------   * WHERE INITIALIZER   * --------------------------------------------------------------------------------   *   * Prepares parameters for insertion in $wheres array().   */ 。

 private function where_init($param)  {   if(!isset($this->wheres[$param]))   {    $this->wheres[$param] = array();    }  }  /**   * --------------------------------------------------------------------------------   * 设置表   * --------------------------------------------------------------------------------   *  参数:   *  $table 表名   */  public function set_table($table){   $this->collection = $table;  }  /**   * --------------------------------------------------------------------------------   * 获取表名   * --------------------------------------------------------------------------------   */  public function get_table(){   return $this->collection;  }  /**   * --------------------------------------------------------------------------------   * 设置表排序   * --------------------------------------------------------------------------------   *  参数:   *  $orderby 排序   */  public function set_orderby($orderby){   $this->page_sorts = $orderby;  }    /**   * --------------------------------------------------------------------------------   * 获取左边结果集   * --------------------------------------------------------------------------------   *  参数:   *  $left 左边显示的个数   *  $last 定位当前页的值   *  $size 页面大小   */  public function get_left($left, $last, $size = PAGE_SIZE){   if($last){    $order = $this->nor_orderby();    if($this->page_sorts[$this->key] == -1){     $this->where_gt($this->key, $last);    } else {      $this->where_lt($this->key, $last);    }    return $this->limit($left * $size)->order_by($order)->get($this->collection);   }  }    /**   * --------------------------------------------------------------------------------   * 获取右边结果集   * --------------------------------------------------------------------------------   *  参数:   *  $right 右边显示的个数   *  $last 定位当前页的值   *  $size 页面大小   */  public function get_right($right, $last, $size = PAGE_SIZE){   if($last){    if($this->page_sorts[$this->key] == -1){     $this->where_lte($this->key, $last);    } else {     $this->where_gte($this->key, $last);    }   }   return $this->limit($right * $size + 1)->order_by($this->page_sorts)->get($this->collection);  }  /**   * --------------------------------------------------------------------------------   * 设置key   * --------------------------------------------------------------------------------   *  参数:   *  $key 设置索引主键   */  public function set_key($key){   $this->key = $key;  }  /**   * --------------------------------------------------------------------------------   * 求反   * --------------------------------------------------------------------------------   */  private function nor_orderby(){   foreach($this->page_sorts as $key => $order){    if($order == -1){     $orderby[$key] = 1;    }else{     $orderby[$key] = -1;    }     }   return $orderby;  }  /**   * --------------------------------------------------------------------------------   * 获取上一页的值   * --------------------------------------------------------------------------------   *  参数:   *  $last 定位当前页的值   *  $size 页面大小   */  public function get_prev($last, $size = PAGE_SIZE){   if($last){    if($this->page_sorts[$this->key] == 1){     $this->where_lt($this->key,$last)->order_by(array($this->key => -1));    } else {     $this->where_gt($this->key,$last)->order_by(array($this->key => 1));    }    $result = $this->limit($size)->get($this->collection);   }   return $result[$size - 1][$this->key];  }   /**   * --------------------------------------------------------------------------------   * 获取下一页的值   * --------------------------------------------------------------------------------   *  参数:   *  $last 定位当前页的值   *  $size 页面大小   */  public function get_next($last, $size = PAGE_SIZE){   if($last){    if($this->page_sorts[$this->key] == 1){     $this->where_gte($this->key,$last);    } else {     $this->where_lte($this->key,$last);    }   }   $result = $this->limit($size+1)->order_by($this->page_sorts)->get($this->collection);   return $result[$size][$this->key];  }  /**   * --------------------------------------------------------------------------------   * 获取最后一页的值   * --------------------------------------------------------------------------------   *  参数:   *  $size 页面大小   */  public function get_last($size = PAGE_SIZE){   $res = $this->count($this->collection) % $size;   $order = $this->nor_orderby();   if($res > 0){    $result = $this->limit($res)->order_by($order)->get($this->collection);    return $result[$res - 1][$this->key];   }else{    $result = $this->limit($size)->order_by($order)->get($this->collection);    return $result[$size - 1][$this->key];   }  }  /**   * --------------------------------------------------------------------------------   * 分页查询   * --------------------------------------------------------------------------------   *  参数:   *  $last 定位当前页的值   *  $size 页面大小   */  public function page_query($last, $size = PAGE_SIZE){   if($last){    if($this->page_sorts[$this->key]==1){     $this->where_gte($this->key,$last);    } else {     $this->where_lte($this->key,$last);    }   }   return $this->limit($size)->order_by($this->page_sorts)->get($this->collection);  }  /**   * 批量执行代码_插入   * @param String $collection   * @param 二维数组 $code   */  public function execute_insert($collection,$code){   //将二维数组分成js格式   $strcode='';   foreach($code as $k=>$v){    foreach($v as $kk=>$vv){     $strcode.='db.getCollection("'.$collection.'").insert({ "'.$kk.'":"'.$vv.'" });';    }      }  // retrun array([ok]=>1);   return $this->db->execute($code);   } 。

} ?> 。

page.class.php mongodb分页逻辑类 。

复制代码 代码如下:

<?php db = $DB;   $this->count = $this->db->count($this->db->get_table());   $url = SITE_ROOT.strtolower(CLASS_NAME).'/'.METHOD_NAME;   $this->url = $this->url ? $this->url : $url;   $set = $set ? $set : 5;   $this->set = $set;   $size = $size ? $size : PAGE_SIZE;   $this->size = $size;   $this->last = $last;   $this->prev = $DB->get_prev($this->last);   $this->next = $DB->get_next($this->last);   //$this->page = GET::UINT('page');   $this->page = $this->page ? $this->page : 1;   $this->total = @ceil($this->count / $this->size);   $this->key = $key;   $this->orderby = $orderby;  }  //输出分页链接  public function get_link(){   if($this->total != 1){    $this->get_first();    $this->get_prev();    $this->get_center();    $this->get_next();    $this->get_last();    $this->get_turnto();   }   if($this->link){    $this->link = $this->turnto.$this->link.'共'.number_format($this->total).'页 '.number_format($this->count).'条记录';   }   if($this->turnto){    $this->link .= '';   }   return $this->link;  }  //获取左边显示的个数  public function get_left(){   return  $this->left = ($this->set - $this->page >= 0) ? ($this->page - 1) : $this->set;  }  //获取右边显示的个数  public function get_right(){   return $this->right = ($this->total - $this->page > $this->set) ? $this->set : ($this->total - $this->page);  }  //设置左边的结果集  public function set_left_result($left_result){   $this->leftresult = $left_result;  }  //设置右边的结果集  public function set_right_result($right_result){   $this->rightresult = $right_result;  }  //设置排序条件  public function set_orderby($orderby){   $this->orderby = $orderby;  }  //设置最后一页  public function set_last($last){   $this->lastd = $last;  }  //设置中间显示页码个数  public function set($set){   $this->set = $set;  }  //获取首页  private function get_first(){   if($this->page != 1){    if($this->total > 0){     $this->link.='首页';    }   }  }  //获取上一页  private function get_prev(){   if($this->prev){    $this->link.='上一页';   }  }  //中间显示  private function get_center(){   $start = ($this->page - $this->set) <= 0 ? 1 : ($this->page - $this->set);    $end = ($this->page + $this->set + 1 >= $this->total) ? $this->total + 1 : ($this->page + $this->set + 1),

  。

  $ii = $this->left;   $iii = 0;   //显示左边的   for($i = $start; $i < $end; $i++, $ii--, $iii++){    if($this->page == $i){     $this->link.=''.$i.'';    }else{     $the_id = $ii * $this->size - 1;     if($the_id > 0){      $this->link.=''.$i.'';     }else{      $the_id = ($iii - $this->left) * $this->size;      $this->link.=''.$i.'';     }       }   }  } 。

 //获取下一页  private function get_next(){   if($this->next){    $this->link.='下一页';   }  }  //获取尾页  private function get_last(){   if($this->page != $this->total){    $this->link.='尾页';   }  }  //跳转到  private function get_turnto(){   $this->turnto = ' 转到第 <input type="text" name="p" style="width:25px;text-align:center"> 页';  }  //求反  public function nor_orderby(){   foreach($this->orderby as $key => $order){    if($order==-1){     $orderby[$key] = 1;    }else{     $orderby[$key] = -1;    }     }   return $orderby;  }  //设置key  public function set_key($key){   $this->key = $key;  }  //分页操作  public function show(){   $this->set_key($this->key);   $this->set_orderby($this->orderby);   $left = $this->get_left();   $right = $this->get_right();   $leftresult = $this->db->get_left($left, $this->last);   $rightresult = $this->db->get_right($right, $this->last);   $this->set_left_result($leftresult);   $this->set_right_result($rightresult);   $last = $this->db->get_last();   $this->set_last($last);   return $this->get_link();  } } /*      调用例子rockmongo   global $DB;   $lastid = GET::UINT('id');   $table = 'log';   $key = '_id';   $orderby = array($key => -1);   $DB->set_table($table);   $DB->set_key($key);   $DB->set_orderby($orderby);   $log = $DB->page_query($lastid),

  $page = new Page($lastid, $key, $orderby);   $pager = $page->show(); */ 。

?> 。

test.php 测试代码 。

复制代码 代码如下:

<?php   include "page.class.php";   include "mongodb.class.php";   define(PAGE_SIZE, 5);//每页大小   $config['HOST'] = '127.0.0.1';   $config['PORT'] = 20081;  //mongodb端口   $config['DATABASE'] = 'domain';//mongodb数据库名   $config['USER'] = '';   $config['PWD'] = '';   $config['PERSIST'] = TRUE,

  。

  $DB = new DB($config),

  $table = 'whois'; //mongodb collection名   $key = '_id';   $orderby = array($key => -1),

  $DB->set_table($table);   $DB->set_key($key);   $DB->set_orderby($orderby),

  $log = $DB->page_query($lastid,5),

  $page = new Page($lastid, $key, $orderby),

  echo $pager = $page->show(),

?> 。

  。

最后此篇关于高效mongodb的php分页类(不使用skip)的文章就讲到这里了,如果你想了解更多关于高效mongodb的php分页类(不使用skip)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com