高效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; } <p>//MongoDB操作类 class DB {</p> <p> private $CI; private $config_file = 'MongoDB';</p> <p> 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;</p> <p> private $selects = array(); private $wheres = array(); private $sorts = array(); private $page_sorts = array();</p> <p> private $limit = 999999; private $offset = 0; </p> <p> /** * -------------------------------------------------------------------------------- * CONSTRUCTOR * -------------------------------------------------------------------------------- * * Automatically check if the Mongo PECL extension has been installed/enabled. * Generate the connection string and establish a connection to the MongoDB. */</p> <p> 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(); } </p> <p> /** * -------------------------------------------------------------------------------- * Switch_db * -------------------------------------------------------------------------------- * * Switch from default database to a different db */</p> <p> 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); } }</p> <p> /** * -------------------------------------------------------------------------------- * 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'); */</p> <p> public function select($includes = array(), $excludes = array()) { if(!is_array($includes)) { $includes = array(); }</p> <p> if(!is_array($excludes)) { $excludes = array(); }</p> <p> if(!empty($includes)) { foreach($includes as $col) { $this->selects[$col] = 1; } } else { foreach($excludes as $col) { $this->selects[$col] = 0; } } return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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'); */</p> <p> public function where($wheres = array()) { foreach($wheres as $wh => $val) { $this->wheres[$wh] = $val; } return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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'); */</p> <p> public function where_in($field = "", $in = array()) { $this->where_init($field); $this->wheres[$field]['$in'] = $in; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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'); */</p> <p> public function where_not_in($field = "", $in = array()) { $this->where_init($field); $this->wheres[$field]['$nin'] = $in; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> public function where_gt($field = "", $x) { $this->where_init($field); $this->wheres[$field]['$gt'] = $x; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> public function where_gte($field = "", $x) { $this->where_init($field); $this->wheres[$field]['$gte'] = $x; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> public function where_lt($field = "", $x) { $this->where_init($field); $this->wheres[$field]['$lt'] = $x; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> public function where_lte($field = "", $x) { $this->where_init($field); $this->wheres[$field]['$lte'] = $x; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> public function where_between($field = "", $x, $y) { $this->where_init($field); $this->wheres[$field]['$gte'] = $x; $this->wheres[$field]['$lte'] = $y; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> public function where_between_ne($field = "", $x, $y) { $this->where_init($field); $this->wheres[$field]['$gt'] = $x; $this->wheres[$field]['$lt'] = $y; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> public function where_ne($field = "", $x) { $this->where_init($field); $this->wheres[$field]['$ne'] = $x; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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' ); */</p> <p> public function where_or($field = "", $values) { $this->where_init($field); $this->wheres[$field]['$or'] = $values; return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * WHERE AND * -------------------------------------------------------------------------------- * * Get the documents where the elements match the specified values * * @usage = $this->mongo_db->where_and( array ( 'foo' => 1, 'b' => 'someexample' ); */</p> <p> public function where_and( $elements_values = array() ) { foreach ( $elements_values as $element => $val ) { $this->wheres[$element] = $val; } return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * WHERE MOD * -------------------------------------------------------------------------------- * * Get the documents where $field % $mod = $result * * @usage = $this->mongo_db->where_mod( 'foo', 10, 1 ); */</p> <p> public function where_mod( $field, $num, $result ) { $this->where_init($field); $this->wheres[$field]['$mod'] = array ( $num, $result ); return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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'); */</p> <p> public function where_size($field = "", $size = "") { $this->_where_init($field); $this->wheres[$field]['$size'] = $size; return ($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> 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);</p> <p> if($enable_start_wildcard !== TRUE) { $value = "^" . $value; }</p> <p> if($enable_end_wildcard !== TRUE) { $value .= "$"; }</p> <p> $regex = "/$value/$flags"; $this->wheres[$field] = new MongoRegex($regex); return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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); */</p> <p> 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); }</p> <p> /** * -------------------------------------------------------------------------------- * LIMIT DOCUMENTS * -------------------------------------------------------------------------------- * * Limit the result set to $x number of documents * * @usage = $this->mongo_db->limit($x); */</p> <p> public function limit($x = 99999) { if($x !== NULL && is_numeric($x) && $x >= 1) { $this->limit = (int) $x; } return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * OFFSET DOCUMENTS * -------------------------------------------------------------------------------- * * Offset the result set to skip $x number of documents * * @usage = $this->mongo_db->offset($x); */</p> <p> public function offset($x = 0) { if($x !== NULL && is_numeric($x) && $x >= 1) { $this->offset = (int) $x; } return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * GET_WHERE * -------------------------------------------------------------------------------- * * Get the documents based upon the passed parameters * * @usage = $this->mongo_db->get_where('foo', array('bar' => 'something')); */</p> <p> public function get_where($collection = "", $where = array(), $limit = 99999) { return($this->where($where)->limit($limit)->get($collection)); }</p> <p> /** * -------------------------------------------------------------------------------- * GET * -------------------------------------------------------------------------------- * * Get the documents based upon the passed parameters * * @usage = $this->mongo_db->get('foo', array('bar' => 'something')); */</p> <p> 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);</p> <p> $returns = array();</p> <p> foreach($documents as $doc): $returns[] = $doc; endforeach; $this->clear(); return($returns);</p> <p> }</p> <p> /** * -------------------------------------------------------------------------------- * COUNT * -------------------------------------------------------------------------------- * * Count the documents based upon the passed parameters * * @usage = $this->mongo_db->get('foo'); */</p> <p> 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()); */</p> <p> public function insert($collection = "", $data = array()) { if(empty($collection)) { show_error("No Mongo collection selected to insert into", 500); }</p> <p> if(count($data) == 0 || !is_array($data)) { show_error("Nothing to insert into Mongo collection or insert is not an array", 500); }</p> <p> 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); }</p> <p> }</p> <p> /** * -------------------------------------------------------------------------------- * UPDATE * -------------------------------------------------------------------------------- * * Update a document into the passed collection * * @usage = $this->mongo_db->update('foo', $data = array()); */</p> <p> 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); }</p> <p> }</p> <p> /** * -------------------------------------------------------------------------------- * UPDATE_ALL * -------------------------------------------------------------------------------- * * Insert a new document into the passed collection * * @usage = $this->mongo_db->update_all('foo', $data = array()); */</p> <p> public function update_all($collection = "", $data = array()) { if(empty($collection)) { show_error("No Mongo collection selected to update", 500); }</p> <p> if(count($data) == 0 || !is_array($data)) { show_error("Nothing to update in Mongo collection or update is not an array", 500); }</p> <p> 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); }</p> <p> }</p> <p> /** * -------------------------------------------------------------------------------- * DELETE * -------------------------------------------------------------------------------- * * delete document from the passed collection based upon certain criteria * * @usage = $this->mongo_db->delete('foo', $data = array()); */</p> <p> 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); }</p> <p> }</p> <p> /** * -------------------------------------------------------------------------------- * DELETE_ALL * -------------------------------------------------------------------------------- * * Delete all documents from the passed collection based upon certain criteria * * @usage = $this->mongo_db->delete_all('foo', $data = array()); */</p> <p> public function delete_all($collection = "") { if(empty($collection)) { show_error("No Mongo collection selected to delete from", 500); }</p> <p> 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); }</p> <p> }</p> <p> /** * -------------------------------------------------------------------------------- * 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)); */</p> <p> public function add_index($collection = "", $keys = array(), $options = array()) { if(empty($collection)) { show_error("No Mongo collection specified to add index to", 500); }</p> <p> 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; } }</p> <p> 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); } }</p> <p> </p> <p> /** * -------------------------------------------------------------------------------- * 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)); */</p> <p> public function remove_index($collection = "", $keys = array()) { if(empty($collection)) { show_error("No Mongo collection specified to remove index from", 500); }</p> <p> if(empty($keys) || !is_array($keys)) { show_error("Index could not be removed from MongoDB Collection because no keys were specified", 500); }</p> <p> 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); } }</p> <p> /** * -------------------------------------------------------------------------------- * REMOVE_ALL_INDEXES * -------------------------------------------------------------------------------- * * Remove all indexes from a collection. * * @usage = $this->mongo_db->remove_all_index($collection); */</p> <p> public function remove_all_indexes($collection = "") { if(empty($collection)) { show_error("No Mongo collection specified to remove all indexes from", 500); }</p> <p> $this->db->{$collection}->deleteIndexes(); $this->clear(); return($this); }</p> <p> /** * -------------------------------------------------------------------------------- * 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()); }</p> <p> /** * -------------------------------------------------------------------------------- * DROP COLLECTION * -------------------------------------------------------------------------------- * * Removes the specified collection from the database. Be careful because this * can have some very large issues in production! */</p> <p> 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; }</p> <p> /** * -------------------------------------------------------------------------------- * 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. */</p> <p> 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'; }</p> <p> 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); } }</p> <p> /** * -------------------------------------------------------------------------------- * BUILD CONNECTION STRING * -------------------------------------------------------------------------------- * * Build the connection string from the config file. */</p> <p> private function connection_string($MONGODB_CONFIG) {</p> <p> $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']);</p> <p> $connection_string = "mongodb://";</p> <p> if(empty($this->host)) { show_error("The Host must be set to connect to MongoDB", 500); }</p> <p> if(empty($this->dbname)) { show_error("The Database must be set to connect to MongoDB", 500); }</p> <p> if(!empty($this->user) && !empty($this->pass)) { $connection_string .= "{$this->user}:{$this->pass}@"; }</p> <p> if(isset($this->port) && !empty($this->port)) { $connection_string .= "{$this->host}:{$this->port}/{$this->dbname}"; } else { $connection_string .= "{$this->host}"; }</p> <p> $this->connection_string = trim($connection_string); }</p> <p> /** * -------------------------------------------------------------------------------- * CLEAR * -------------------------------------------------------------------------------- * * Resets the class variables to default settings */</p> <p> private function clear() { $this->selects = array(); $this->wheres = array(); $this->limit = NULL; $this->offset = NULL; $this->sorts = array(); }</p> <p> /** * -------------------------------------------------------------------------------- * WHERE INITIALIZER * -------------------------------------------------------------------------------- * * Prepares parameters for insertion in $wheres array(). */</p> <p> 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); }</p> <p>} ?></p>
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); <p> $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.''; } } } }</p> <p> //获取下一页 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);</p> <p> $page = new Page($lastid, $key, $orderby); $pager = $page->show(); */</p> <p>?></p>
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; <p> $DB = new DB($config);</p> <p> $table = 'whois'; //mongodb collection名 $key = '_id'; $orderby = array($key => -1);</p> <p> $DB->set_table($table); $DB->set_key($key); $DB->set_orderby($orderby);</p> <p> $log = $DB->page_query($lastid,5);</p> <p> $page = new Page($lastid, $key, $orderby);</p> <p> echo $pager = $page->show();</p> <p> ?></p>
相关推荐
lbyd0 2020-11-17
BigYellow 2020-11-16
sushuanglei 2020-11-12
我心似明月 2020-11-09
zhushenghan 2020-11-09
sunnnyduan 2020-10-16
不要皱眉 2020-10-14
xiaohai 2020-09-29
songxiugongwang 2020-09-22
萌亖 2020-09-17
LuckyLXG 2020-09-08
sdmzhu 2020-09-01
mkhhxxttxs 2020-09-16
xiaohai 2020-09-16
newcome 2020-09-09
jaylong 2020-08-19
大秦铁骑 2020-08-19
thatway 2020-08-19