高效mongodb的php分页类(不使用skip)
mongodb分页skip+limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。
如果能够通过查询条件查出每页结果的最后一条记录,在用最后一条记录作为查询条件去查下一页,这样每次都查询页面size条记录,效率不会差。
具体代码如下:包含mongodb.class.php,page.class.php,test.php
mongodb.class.phpmongodb操作类
<?php
functionshow_error($message,$status_code=500,$heading="AnErrorWasEncountered")
{
echo$message,$status_code,PHP_EOL;
exit;
}
//MongoDB操作类
classDB
{
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
*--------------------------------------------------------------------------------
*
*AutomaticallycheckiftheMongoPECLextensionhasbeeninstalled/enabled.
*GeneratetheconnectionstringandestablishaconnectiontotheMongoDB.
*/
publicfunction__construct($MONGODB_CONFIG)
{
if(!class_exists("Mongo"))
{
show_error("TheMongoDBPECLextensionhasnotbeeninstalledorenabled",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
*--------------------------------------------------------------------------------
*
*Switchfromdefaultdatabasetoadifferentdb
*/
publicfunctionswitch_db($database="")
{
if(empty($database))
{
show_error("ToswitchMongoDBdatabases,anewdatabasenamemustbespecified",500);
}
$this->dbname=$database;
try
{
$this->db=$this->connection->{$this->dbname};
return(TRUE);
}
catch(Exception$e)
{
show_error("UnabletoswitchMongoDatabases:{$e->getMessage()}",500);
}
}
/**
*--------------------------------------------------------------------------------
*SELECTFIELDS
*--------------------------------------------------------------------------------
*
*DeterminewhichfieldstoincludeORwhichtoexcludeduringthequeryprocess.
*Currently,includingandexcludingatthesametimeisnotavailable,sothe
*$includesarraywilltakeprecedenceoverthe$excludesarray. Ifyouwantto
*onlychoosefieldstoexclude,leave$includesanemptyarray().
*
*@usage:$this->mongo_db->select(array("foo","bar"))->get("foobar");
*/
publicfunctionselect($includes=array(),$excludes=array())
{
if(!is_array($includes))
{
$includes=array();
}
if(!is_array($excludes))
{
$excludes=array();
}
if(!empty($includes))
{
foreach($includesas$col)
{
$this->selects[$col]=1;
}
}
else
{
foreach($excludesas$col)
{
$this->selects[$col]=0;
}
}
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentsbasedonthesesearchparameters. The$wheresarrayshould
*beanassociativearraywiththefieldasthekeyandthevalueasthesearch
*criteria.
*
*@usage=$this->mongo_db->where(array("foo"=>"bar"))->get("foobar");
*/
publicfunctionwhere($wheres=array())
{
foreach($wheresas$wh=>$val)
{
$this->wheres[$wh]=$val;
}
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHERE_INPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisinagiven$inarray().
*
*@usage=$this->mongo_db->where_in("foo",array("bar","zoo","blah"))->get("foobar");
*/
publicfunctionwhere_in($field="",$in=array())
{
$this->where_init($field);
$this->wheres[$field]["$in"]=$in;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHERE_NOT_INPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisnotinagiven$inarray().
*
*@usage=$this->mongo_db->where_not_in("foo",array("bar","zoo","blah"))->get("foobar");
*/
publicfunctionwhere_not_in($field="",$in=array())
{
$this->where_init($field);
$this->wheres[$field]["$nin"]=$in;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREGREATERTHANPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisgreaterthan$x
*
*@usage=$this->mongo_db->where_gt("foo",20);
*/
publicfunctionwhere_gt($field="",$x)
{
$this->where_init($field);
$this->wheres[$field]["$gt"]=$x;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREGREATERTHANOREQUALTOPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisgreaterthanorequalto$x
*
*@usage=$this->mongo_db->where_gte("foo",20);
*/
publicfunctionwhere_gte($field="",$x)
{
$this->where_init($field);
$this->wheres[$field]["$gte"]=$x;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHERELESSTHANPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldislessthan$x
*
*@usage=$this->mongo_db->where_lt("foo",20);
*/
publicfunctionwhere_lt($field="",$x)
{
$this->where_init($field);
$this->wheres[$field]["$lt"]=$x;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHERELESSTHANOREQUALTOPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldislessthanorequalto$x
*
*@usage=$this->mongo_db->where_lte("foo",20);
*/
publicfunctionwhere_lte($field="",$x)
{
$this->where_init($field);
$this->wheres[$field]["$lte"]=$x;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREBETWEENPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisbetween$xand$y
*
*@usage=$this->mongo_db->where_between("foo",20,30);
*/
publicfunctionwhere_between($field="",$x,$y)
{
$this->where_init($field);
$this->wheres[$field]["$gte"]=$x;
$this->wheres[$field]["$lte"]=$y;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREBETWEENANDNOTEQUALTOPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisbetweenbutnotequalto$xand$y
*
*@usage=$this->mongo_db->where_between_ne("foo",20,30);
*/
publicfunctionwhere_between_ne($field="",$x,$y)
{
$this->where_init($field);
$this->wheres[$field]["$gt"]=$x;
$this->wheres[$field]["$lt"]=$y;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHERENOTEQUALTOPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisnotequalto$x
*
*@usage=$this->mongo_db->where_between("foo",20,30);
*/
publicfunctionwhere_ne($field="",$x)
{
$this->where_init($field);
$this->wheres[$field]["$ne"]=$x;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREOR
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethevalueofa$fieldisinoneormorevalues
*
*@usage=$this->mongo_db->where_or("foo",array("foo","bar","blegh");
*/
publicfunctionwhere_or($field="",$values)
{
$this->where_init($field);
$this->wheres[$field]["$or"]=$values;
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREAND
*--------------------------------------------------------------------------------
*
*Getthedocumentswheretheelementsmatchthespecifiedvalues
*
*@usage=$this->mongo_db->where_and(array("foo"=>1,"b"=>"someexample");
*/
publicfunctionwhere_and($elements_values=array()){
foreach($elements_valuesas$element=>$val){
$this->wheres[$element]=$val;
}
return($this);
}
/**
*--------------------------------------------------------------------------------
*WHEREMOD
*--------------------------------------------------------------------------------
*
*Getthedocumentswhere$field%$mod=$result
*
*@usage=$this->mongo_db->where_mod("foo",10,1);
*/
publicfunctionwhere_mod($field,$num,$result){
$this->where_init($field);
$this->wheres[$field]["$mod"]=array($num,$result);
return($this);
}
/**
*--------------------------------------------------------------------------------
*Wheresize
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethesizeofafieldisinagiven$sizeint
*
*@usage:$this->mongo_db->where_size("foo",1)->get("foobar");
*/
publicfunctionwhere_size($field="",$size="")
{
$this->_where_init($field);
$this->wheres[$field]["$size"]=$size;
return($this);
}
/**
*--------------------------------------------------------------------------------
*LIKEPARAMETERS
*--------------------------------------------------------------------------------
*
*Getthedocumentswherethe(string)valueofa$fieldislikeavalue.Thedefaults
*allowforacase-insensitivesearch.
*
*@param$flags
*Allowsforthetypicalregularexpressionflags:
* i=caseinsensitive
* m=multiline
* x=cancontaincomments
* l=locale
* s=dotall,"."matcheseverything,includingnewlines
* u=matchunicode
*
*@param$enable_start_wildcard
*IfsettoanythingotherthanTRUE,astartinglinecharacter"^"willbeprepended
*tothesearchvalue,representingonlysearchingforavalueatthestartof
*anewline.
*
*@param$enable_end_wildcard
*IfsettoanythingotherthanTRUE,anendinglinecharacter"$"willbeappended
*tothesearchvalue,representingonlysearchingforavalueattheendof
*aline.
*
*@usage=$this->mongo_db->like("foo","bar","im",FALSE,TRUE);
*/
publicfunctionlike($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]=newMongoRegex($regex);
return($this);
}
/**
*--------------------------------------------------------------------------------
*ORDERBYPARAMETERS
*--------------------------------------------------------------------------------
*
*Sortthedocumentsbasedontheparameterspassed.Tosetvaluestodescendingorder,
*youmustpassvaluesofeither-1,FALSE,"desc",or"DESC",elsetheywillbe
*setto1(ASC).
*
*@usage=$this->mongo_db->where_between("foo",20,30);
*/
publicfunctionorder_by($fields=array())
{
foreach($fieldsas$col=>$val)
{
if($val==-1||$val===FALSE||strtolower($val)=="desc")
{
$this->sorts[$col]=-1;
}
else
{
$this->sorts[$col]=1;
}
}
return($this);
}
/**
*--------------------------------------------------------------------------------
*LIMITDOCUMENTS
*--------------------------------------------------------------------------------
*
*Limittheresultsetto$xnumberofdocuments
*
*@usage=$this->mongo_db->limit($x);
*/
publicfunctionlimit($x=99999){
if($x!==NULL&&is_numeric($x)&&$x>=1)
{
$this->limit=(int)$x;
}
return($this);
}
/**
*--------------------------------------------------------------------------------
*OFFSETDOCUMENTS
*--------------------------------------------------------------------------------
*
*Offsettheresultsettoskip$xnumberofdocuments
*
*@usage=$this->mongo_db->offset($x);
*/
publicfunctionoffset($x=0)
{
if($x!==NULL&&is_numeric($x)&&$x>=1)
{
$this->offset=(int)$x;
}
return($this);
}
/**
*--------------------------------------------------------------------------------
*GET_WHERE
*--------------------------------------------------------------------------------
*
*Getthedocumentsbaseduponthepassedparameters
*
*@usage=$this->mongo_db->get_where("foo",array("bar"=>"something"));
*/
publicfunctionget_where($collection="",$where=array(),$limit=99999)
{
return($this->where($where)->limit($limit)->get($collection));
}
/**
*--------------------------------------------------------------------------------
*GET
*--------------------------------------------------------------------------------
*
*Getthedocumentsbaseduponthepassedparameters
*
*@usage=$this->mongo_db->get("foo",array("bar"=>"something"));
*/
publicfunctionget($collection="")
{
if(empty($collection))
{
show_error("InordertoretreivedocumentsfromMongoDB,acollectionnamemustbepassed",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($documentsas$doc):
$returns[]=$doc;
endforeach;
$this->clear();
return($returns);
}
/**
*--------------------------------------------------------------------------------
*COUNT
*--------------------------------------------------------------------------------
*
*Countthedocumentsbaseduponthepassedparameters
*
*@usage=$this->mongo_db->get("foo");
*/
publicfunctioncount($collection="")
{
if(empty($collection))
{
show_error("InordertoretreiveacountofdocumentsfromMongoDB,acollectionnamemustbepassed",500);
}
$count=$this->db->{$collection}->find($this->wheres)->limit((int)$this->limit)->skip((int)$this->offset)->count();
$this->clear();
return($count);
}
/**
*自增ID实现
*returninsert_id
*/
privatefunctioninsert_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
*--------------------------------------------------------------------------------
*
*Insertanewdocumentintothepassedcollection
*
*@usage=$this->mongo_db->insert("foo",$data=array());
*/
publicfunctioninsert($collection="",$data=array()){
if(empty($collection))
{
show_error("NoMongocollectionselectedtoinsertinto",500);
}
if(count($data)==0||!is_array($data))
{
show_error("NothingtoinsertintoMongocollectionorinsertisnotanarray",500);
}
try
{
$inc=$this->insert_inc($collection);
$data["_id"]=$inc;
$result=$this->db->{$collection}->insert($data,array("fsync"=>TRUE));
if($result["ok"]||$result){
returntrue;
}
else{
returnfalse;
}
}
catch(MongoCursorException$e)
{
show_error("InsertofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*--------------------------------------------------------------------------------
*UPDATE
*--------------------------------------------------------------------------------
*
*Updateadocumentintothepassedcollection
*
*@usage=$this->mongo_db->update("foo",$data=array());
*/
publicfunctionupdate($collection="",$data=array(),$flage=false)
{
if(empty($collection))
{
show_error("NoMongocollectionselectedtoupdate",500);
}
if(count($data)==0||!is_array($data))
{
show_error("NothingtoupdateinMongocollectionorupdateisnotanarray",500);
}
unset($data["_id"]);
if($flage){
$arr=$this->wheres;
unset($arr["_id"]);
if(is_array($arr)){
foreach($arras$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("UpdateofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*--------------------------------------------------------------------------------
*UPDATE_ALL
*--------------------------------------------------------------------------------
*
*Insertanewdocumentintothepassedcollection
*
*@usage=$this->mongo_db->update_all("foo",$data=array());
*/
publicfunctionupdate_all($collection="",$data=array()){
if(empty($collection))
{
show_error("NoMongocollectionselectedtoupdate",500);
}
if(count($data)==0||!is_array($data))
{
show_error("NothingtoupdateinMongocollectionorupdateisnotanarray",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("UpdateofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*--------------------------------------------------------------------------------
*DELETE
*--------------------------------------------------------------------------------
*
*deletedocumentfromthepassedcollectionbaseduponcertaincriteria
*
*@usage=$this->mongo_db->delete("foo",$data=array());
*/
publicfunctiondelete($collection,$where)
{
if(empty($collection))
{
show_error("NoMongocollectionselectedtodeletefrom",500);
}
if(!$where){
show_error("Nodatainputtodelete",500);
}
try
{
$this->wheres=$where;
$this->db->{$collection}->remove($this->wheres);
$this->clear();
return(TRUE);
}
catch(MongoCursorException$e)
{
show_error("DeleteofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*--------------------------------------------------------------------------------
*DELETE_ALL
*--------------------------------------------------------------------------------
*
*Deletealldocumentsfromthepassedcollectionbaseduponcertaincriteria
*
*@usage=$this->mongo_db->delete_all("foo",$data=array());
*/
publicfunctiondelete_all($collection="")
{
if(empty($collection))
{
show_error("NoMongocollectionselectedtodeletefrom",500);
}
try
{
$this->db->{$collection}->remove($this->wheres,array("fsync"=>TRUE,"justOne"=>FALSE));
$this->clear();
return(TRUE);
}
catch(MongoCursorException$e)
{
show_error("DeleteofdataintoMongoDBfailed:{$e->getMessage()}",500);
}
}
/**
*--------------------------------------------------------------------------------
*ADD_INDEX
*--------------------------------------------------------------------------------
*
*Ensureanindexofthekeysinacollectionwithoptionalparameters.Tosetvaluestodescendingorder,
*youmustpassvaluesofeither-1,FALSE,"desc",or"DESC",elsetheywillbe
*setto1(ASC).
*
*@usage=$this->mongo_db->add_index($collection,array("first_name"=>"ASC","last_name"=>-1),array("unique"=>TRUE));
*/
publicfunctionadd_index($collection="",$keys=array(),$options=array())
{
if(empty($collection))
{
show_error("NoMongocollectionspecifiedtoaddindexto",500);
}
if(empty($keys)||!is_array($keys))
{
show_error("IndexcouldnotbecreatedtoMongoDBCollectionbecausenokeyswerespecified",500);
}
foreach($keysas$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("AnerroroccuredwhentryingtoaddanindextoMongoDBCollection",500);
}
}
/**
*--------------------------------------------------------------------------------
*REMOVE_INDEX
*--------------------------------------------------------------------------------
*
*Removeanindexofthekeysinacollection.Tosetvaluestodescendingorder,
*youmustpassvaluesofeither-1,FALSE,"desc",or"DESC",elsetheywillbe
*setto1(ASC).
*
*@usage=$this->mongo_db->remove_index($collection,array("first_name"=>"ASC","last_name"=>-1));
*/
publicfunctionremove_index($collection="",$keys=array())
{
if(empty($collection))
{
show_error("NoMongocollectionspecifiedtoremoveindexfrom",500);
}
if(empty($keys)||!is_array($keys))
{
show_error("IndexcouldnotberemovedfromMongoDBCollectionbecausenokeyswerespecified",500);
}
if($this->db->{$collection}->deleteIndex($keys,$options)==TRUE)
{
$this->clear();
return($this);
}
else
{
show_error("AnerroroccuredwhentryingtoremoveanindexfromMongoDBCollection",500);
}
}
/**
*--------------------------------------------------------------------------------
*REMOVE_ALL_INDEXES
*--------------------------------------------------------------------------------
*
*Removeallindexesfromacollection.
*
*@usage=$this->mongo_db->remove_all_index($collection);
*/
publicfunctionremove_all_indexes($collection=""){
if(empty($collection))
{
show_error("NoMongocollectionspecifiedtoremoveallindexesfrom",500);
}
$this->db->{$collection}->deleteIndexes();
$this->clear();
return($this);
}
/**
*--------------------------------------------------------------------------------
*LIST_INDEXES
*--------------------------------------------------------------------------------
*
*Listsallindexesinacollection.
*
*@usage=$this->mongo_db->list_indexes($collection);
*/
publicfunctionlist_indexes($collection=""){
if(empty($collection))
{
show_error("NoMongocollectionspecifiedtoremoveallindexesfrom",500);
}
return($this->db->{$collection}->getIndexInfo());
}
/**
*--------------------------------------------------------------------------------
*DROPCOLLECTION
*--------------------------------------------------------------------------------
*
*Removesthespecifiedcollectionfromthedatabase. Becarefulbecausethis
* canhavesomeverylargeissuesinproduction!
*/
publicfunctiondrop_collection($collection="")
{
if(empty($collection))
{
show_error("NoMongocollectionspecifiedtodropfromdatabase",500);
}
$this->db->{$collection}->drop();
returnTRUE;
}
/**
*--------------------------------------------------------------------------------
*CONNECTTOMONGODB
*--------------------------------------------------------------------------------
*
*EstablishaconnectiontoMongoDBusingtheconnectionstringgeneratedin
*theconnection_string()method. If"mongo_persist_key"wassettotrueinthe
*configfile,establishapersistentconnection. Weallowforonlythe"persist"
*optiontobesetbecausewewanttoestablishaconnectionimmediately.
*/
privatefunctionconnect(){
$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=newMongo($this->connection_string,$options);
$this->db=$this->connection->{$this->dbname};
return($this);
}
catch(MongoConnectionException$e)
{
show_error("UnabletoconnecttoMongoDB:{$e->getMessage()}",500);
}
}
/**
*--------------------------------------------------------------------------------
*BUILDCONNECTIONSTRING
*--------------------------------------------------------------------------------
*
*Buildtheconnectionstringfromtheconfigfile.
*/
privatefunctionconnection_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("TheHostmustbesettoconnecttoMongoDB",500);
}
if(empty($this->dbname))
{
show_error("TheDatabasemustbesettoconnecttoMongoDB",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
*--------------------------------------------------------------------------------
*
*Resetstheclassvariablestodefaultsettings
*/
privatefunctionclear()
{
$this->selects=array();
$this->wheres=array();
$this->limit=NULL;
$this->offset=NULL;
$this->sorts=array();
}
/**
*--------------------------------------------------------------------------------
*WHEREINITIALIZER
*--------------------------------------------------------------------------------
*
*Preparesparametersforinsertionin$wheresarray().
*/
privatefunctionwhere_init($param)
{
if(!isset($this->wheres[$param]))
{
$this->wheres[$param]=array();
}
}
/**
*--------------------------------------------------------------------------------
*设置表
*--------------------------------------------------------------------------------
* 参数:
* $table表名
*/
publicfunctionset_table($table){
$this->collection=$table;
}
/**
*--------------------------------------------------------------------------------
*获取表名
*--------------------------------------------------------------------------------
*/
publicfunctionget_table(){
return$this->collection;
}
/**
*--------------------------------------------------------------------------------
*设置表排序
*--------------------------------------------------------------------------------
* 参数:
* $orderby排序
*/
publicfunctionset_orderby($orderby){
$this->page_sorts=$orderby;
}
/**
*--------------------------------------------------------------------------------
*获取左边结果集
*--------------------------------------------------------------------------------
* 参数:
* $left左边显示的个数
* $last定位当前页的值
* $size页面大小
*/
publicfunctionget_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页面大小
*/
publicfunctionget_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设置索引主键
*/
publicfunctionset_key($key){
$this->key=$key;
}
/**
*--------------------------------------------------------------------------------
*求反
*--------------------------------------------------------------------------------
*/
privatefunctionnor_orderby(){
foreach($this->page_sortsas$key=>$order){
if($order==-1){
$orderby[$key]=1;
}else{
$orderby[$key]=-1;
}
}
return$orderby;
}
/**
*--------------------------------------------------------------------------------
*获取上一页的值
*--------------------------------------------------------------------------------
* 参数:
* $last定位当前页的值
* $size页面大小
*/
publicfunctionget_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页面大小
*/
publicfunctionget_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页面大小
*/
publicfunctionget_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页面大小
*/
publicfunctionpage_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);
}
/**
*批量执行代码_插入
*@paramString$collection
*@param二维数组$code
*/
publicfunctionexecute_insert($collection,$code){
//将二维数组分成js格式
$strcode="";
foreach($codeas$k=>$v){
foreach($vas$kk=>$vv){
$strcode.="db.getCollection("".$collection."").insert({"".$kk."":"".$vv.""});";
}
}
//retrunarray([ok]=>1);
return$this->db->execute($code);
}
}
?>
page.class.phpmongodb分页逻辑类
<?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;
}
//输出分页链接
publicfunctionget_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;
}
//获取左边显示的个数
publicfunctionget_left(){
return $this->left=($this->set-$this->page>=0)?($this->page-1):$this->set;
}
//获取右边显示的个数
publicfunctionget_right(){
return$this->right=($this->total-$this->page>$this->set)?$this->set:($this->total-$this->page);
}
//设置左边的结果集
publicfunctionset_left_result($left_result){
$this->leftresult=$left_result;
}
//设置右边的结果集
publicfunctionset_right_result($right_result){
$this->rightresult=$right_result;
}
//设置排序条件
publicfunctionset_orderby($orderby){
$this->orderby=$orderby;
}
//设置最后一页
publicfunctionset_last($last){
$this->lastd=$last;
}
//设置中间显示页码个数
publicfunctionset($set){
$this->set=$set;
}
//获取首页
privatefunctionget_first(){
if($this->page!=1){
if($this->total>0){
$this->link.="首页";
}
}
}
//获取上一页
privatefunctionget_prev(){
if($this->prev){
$this->link.="上一页";
}
}
//中间显示
privatefunctionget_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."";
}
}
}
}
//获取下一页
privatefunctionget_next(){
if($this->next){
$this->link.="下一页";
}
}
//获取尾页
privatefunctionget_last(){
if($this->page!=$this->total){
$this->link.="尾页";
}
}
//跳转到
privatefunctionget_turnto(){
$this->turnto="
转到第<inputtype="text"name="p"style="width:25px;text-align:center">页";
}
//求反
publicfunctionnor_orderby(){
foreach($this->orderbyas$key=>$order){
if($order==-1){
$orderby[$key]=1;
}else{
$orderby[$key]=-1;
}
}
return$orderby;
}
//设置key
publicfunctionset_key($key){
$this->key=$key;
}
//分页操作
publicfunctionshow(){
$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=newPage($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=newDB($config);
$table="whois";//mongodbcollection名
$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=newPage($lastid,$key,$orderby);
echo$pager=$page->show();
?>
相关文章
- MySQL异常捕获:使用PHP技巧轻松完成(php捕获mysql异常)
- MongoDB 存在的缺点及其影响(mongodb缺点)
- 管理Mongodb类库管理:简洁、有效、轻松(mongodb类库)
- MongoDB: 了解复合索引的好处(mongodb复合索引)
- 及使用MongoDB安装与使用指南(mongodb安装)
- MongoDB:优秀的数据库解决方案(mongodb的使用场景)
- 实现安全:MongoDB 权限管理指南(mongodb权限管理)
- 使用PHP执行Linux脚本:简单而快速!(php执行linux脚本)
- MySQL and PHP: Establishing the Perfect Connection(mysql链接php)
- MongoDB:释放剩余的空间(mongodb释放空间)
- MongoDB:解读运行机制(mongodb进程)
- MongoDB架构设计的优势原则(mongodb设计原则)
- PHP与MySQL的网站搭建指南(php和mysql搭建)
- 使用PHP连接Linux,轻松实现物联网设备管理。(php连接linux)
- PHP与MySQL结合使用实现关联查询的方法(php关联mysql查询)
- 使用MongoDB客户端连接数据库,轻松管理数据(mongodb客户端连接)
- 安全使用MongoDB实现线程安全(mongodb线程)
- 用Redis作为PHP缓存:提高性能和效率(php中redis做缓存)
- 使用MongoDB实现高效的模糊查询技巧(mongodb的模糊查询)
- 使用MongoDB PDO操作数据库(mongodb pdo)
- 使用PHP编写连接MSSQL类,轻松实现数据库操作(php连接mssql 类)
- PHP如何操作MSSQL数据库(php怎样使用mssql)
- PHP编写的MSSQL查询:实现可能性无限(php写mssql查询)
- 使用Mongodb运行JavaScript脚本(mongodb执行js)
- 令人兴奋的MongoDB与Vue结合(mongodbvue)
- MongoDB绘制图表:从数据库中发现规律(mongodb图表)
- 不重新编译PHP为php增加openssl模块的方法
- PHP数组操作汇总php数组的使用技巧