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); }
} ?>
<?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(); */
?>
<?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();
?>
问题内容: 我搜索并没有找到解决该问题的Go解决方案,无论是否使用,都没有,也没有在其他任何站点上。 假设我们在Gogo中建模了一个MongoDB集合: 我们希望根据某些条件对用户进行排序和列出,但是由于预期结果列表较长,因此已实现了分页。 为了实现对某些查询结果的分页,MongoDB和驱动程序包以和的形式内置支持,例如: 但是,如果页数增加,这将变得很慢,因为MongoDB不能仅“神奇地”跳到结
本文向大家介绍MongoDB 使用Skip和limit分页,包括了MongoDB 使用Skip和limit分页的使用技巧和注意事项,需要的朋友参考一下 使用Skip和limit可以如下做数据分页: Code: 备注:可用于分页,limit是pageSize,skip是第n-1页*pageSize (n-1表示几 第1,2...页) skip表示跳过 多少条数据, 聚合管道的优
有人知道从表中分页记录吗。实际上,我想用DynamoDb在php中创建一个分页组件。 它似乎是不可能给分页喜欢 因为Dyanmodb只提供了LIMIT子句,通过它我们可以读取一定数量的记录,并且可以通过LastEvaluatedKey处理接下来的n条记录。所以如果我想直接跳到第五页,怎么可能呢? 据我所知,我们不能在页码中显示页码。我们可以做的就是读取一定数量的记录,并提供下一个链接来检索下一个n
这篇文章展示了对DB2中的数据进行分页的一些操作: 在MySQL中,我可以使用 若要获取总行数,请执行以下操作。第一部分很容易在DB2的最新版本中复制。我在Google上找不到任何与第二个查询相当的结果(我不想要临时表、子查询或其他荒谬的低效解决方案)。
我想执行一个进行基本分页的聚合查询: 查找属于某个 以下是查询的详细信息: 这将查找所有匹配的文档: 这对文档进行了排序: 这会对文档进行计数,并传递未修改的文档,但我肯定这样做是错误的,因为事情从这里开始变得很奇怪: 这似乎跳过了一些文档: 这本应限制文件,但却没有: 这会返回计数,但不会返回数组中的文档,而是返回每个字段的数组: 结果是: 我哪里弄错了?
我有两个收藏品。 null 员额 post_id user_id 主题 正文 附件 创建_at 更新_at (User和Posts集合都有2000000个文档) null 所以我先提取过滤过的用户。 并通过过滤的用户提取帖子。 但随着服务的成长,帖子和用户数据将会增加。 这里有其他性能改进吗? 任何建议,非常感谢。