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','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',30); */
public function where_between_ne($field = "",$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',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','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,'desc',or 'DESC',else they will be * set to 1 (ASC). * * @usage = $this->mongo_db->where_between('foo',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,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,'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,'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,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,else they will be * set to 1 (ASC). * * @usage = $this->mongo_db->remove_index($collection,'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,$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); } } 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,$orderby);
echo $pager = $page->show();
?> (编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|