mongodb分頁skip+limit分頁要先查出所有結(jié)果再去跳過,這樣如果查詢頁面越往后效率越低。
如果能夠通過查詢條件查出每頁結(jié)果的最后一條記錄,在用最后一條記錄作為查詢條件去查下一頁,這樣每次都查詢頁面size條記錄,效率不會差。
具體代碼如下:包含mongodb.class.php, page.class.php, test.php
mongodb.class.php mongodb 操作類
			//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實(shí)現(xiàn)
			  * 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();
			   }
			 }
			
			 /**
			  * --------------------------------------------------------------------------------
			  * 設(shè)置表
			  * --------------------------------------------------------------------------------
			  *  參數(shù):
			  *  $table 表名
			  */
			 public function set_table($table){
			  $this->collection = $table;
			 }
			
			 /**
			  * --------------------------------------------------------------------------------
			  * 獲取表名
			  * --------------------------------------------------------------------------------
			  */
			 public function get_table(){
			  return $this->collection;
			 }
			
			 /**
			  * --------------------------------------------------------------------------------
			  * 設(shè)置表排序
			  * --------------------------------------------------------------------------------
			  *  參數(shù):
			  *  $orderby 排序
			  */
			 public function set_orderby($orderby){
			  $this->page_sorts = $orderby;
			 }
			
			 
			 /**
			  * --------------------------------------------------------------------------------
			  * 獲取左邊結(jié)果集
			  * --------------------------------------------------------------------------------
			  *  參數(shù):
			  *  $left 左邊顯示的個(gè)數(shù)
			  *  $last 定位當(dāng)前頁的值
			  *  $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); 
			  }
			 }
			
			 
			 /**
			  * --------------------------------------------------------------------------------
			  * 獲取右邊結(jié)果集
			  * --------------------------------------------------------------------------------
			  *  參數(shù):
			  *  $right 右邊顯示的個(gè)數(shù)
			  *  $last 定位當(dāng)前頁的值
			  *  $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);
			 }
			
			 /**
			  * --------------------------------------------------------------------------------
			  * 設(shè)置key
			  * --------------------------------------------------------------------------------
			  *  參數(shù):
			  *  $key 設(shè)置索引主鍵
			  */
			 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;
			 }
			
			 /**
			  * --------------------------------------------------------------------------------
			  * 獲取上一頁的值
			  * -------------------------------------------------------------------------------- 
			  *  參數(shù):
			  *  $last 定位當(dāng)前頁的值
			  *  $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];
			 }
			
			  /**
			  * --------------------------------------------------------------------------------
			  * 獲取下一頁的值
			  * -------------------------------------------------------------------------------- 
			  *  參數(shù):
			  *  $last 定位當(dāng)前頁的值
			  *  $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];
			 }
			
			 /**
			  * --------------------------------------------------------------------------------
			  * 獲取最后一頁的值
			  * -------------------------------------------------------------------------------- 
			  *  參數(shù):
			  *  $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];
			  }
			 }
			
			 /**
			  * --------------------------------------------------------------------------------
			  * 分頁查詢
			  * -------------------------------------------------------------------------------- 
			  *  參數(shù):
			  *  $last 定位當(dāng)前頁的值
			  *  $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);
			 } 
			
			 /**
			  * 批量執(zhí)行代碼_插入
			  * @param String $collection
			  * @param 二維數(shù)組 $code 
			  */
			 public function execute_insert($collection,$code){
			  //將二維數(shù)組分成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);  
			 }
			}
			?>
			  $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.='尾頁';
			  }
			 }
			
			 //跳轉(zhuǎn)到
			 private function get_turnto(){
			  $this->turnto = '
			轉(zhuǎn)到第 <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;
			 }
			
			 //設(shè)置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();
			 }
			}
			/*      調(diào)用例子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();
			*/
?>
$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();
			
			?>
新聞熱點(diǎn)
疑難解答