2010-06-09 55 views
17

我在做對嗎?我去看了一些舊的PHP代碼w/MySQL,我設法讓它工作,但我想知道是否有一個「更乾淨」和「更快」的方式來完成這一點。如何正確使用mongodb和php處理分頁查詢?

首先,我需要得到「文件」

$total_documents = $collection->find(array("tags" => $tag, 
     "seeking" => $this->session->userdata('gender'), 
     "gender" => $this->session->userdata('seeking')))->count(); 

$skip = (int)($docs_per_page * ($page - 1)); 
$limit = $docs_per_page; 
$total_pages = ceil($total_documents/$limit); 

//查詢來填充數組,所以我可以分頁顯示

$data['result'] = $collection->find(array("tags" => $tag, 
     "seeking" => $this->session->userdata('gender'), 
     "gender" => $this->session->userdata('seeking')))->limit($limit)->skip($skip)->sort(array("_id" => -1)); 

我的問題是,我可以運行的總數查詢在一個鏡頭?我基本上運行相同的查詢兩次,除了第二次我傳遞值跳過記錄之間。

- 新的代碼...

好了,除非有人知道的另一種方式來做到這一點(如果可能的話),我會說這是不可行的。就這樣說,我改變了通過mongodb運行查詢的方式,從而產生了更好看的代碼。 ;-)我試圖儘量減少到DB的旅程,但是很希望這不會影響性能。我的另一個嘗試是計算陣列中元素的數量,但很快發現這是行不通的,因爲$ limit & $ skip參數會給出它的文檔總數。

$skip = (int)($docs_per_page * ($page - 1)); 
$limit = $docs_per_page; 

$query = array("loc" => array('$near' => array('lat' => $latitude, 'lon' => $longitute)), 
     "tags" => $tag, "seeking" => $this->session->userdata('gender'), 
     "gender" => $this->session->userdata('seeking')); 

$fields = array("username", "zipcode", "tags", "birth_date"); 
$total_documents = $collection->find($query, array("_id"))->count(); 
$data['result'] = $collection->find($query, $fields)->limit($limit)->skip($skip); 

回答

20

由於發現的結果() - >限制() - >跳過()是一個Mongo_Cursor你不必兩次執行的實際查詢。

下也能正常運行:

$skip = (int)($docs_per_page * ($page - 1)); 
$limit = $docs_per_page; 

$query = array("loc" => array('$near' => array('lat' => $latitude, 'lon' => $longitute)), 
    "tags" => $tag, "seeking" => $this->session->userdata('gender'), 
    "gender" => $this->session->userdata('seeking')); 

$fields = array("username", "zipcode", "tags", "birth_date"); 
$cursor = $collection->find($query, $fields)->limit($limit)->skip($skip); 
$total_documents = $cursor->count(); 
$data['result'] = $cursor; 

順便說一句我第一次誤讀了你的問題,我還以爲你不知道極限&跳過。

+2

不應該跳過來限制之前? – Chamila 2013-05-01 16:11:35

1

是的,你做對了。 你可以一次運行查詢。

這裏是尋呼例如:

function printStudents(pageNumber, nPerPage) { 
    print("Page: " + pageNumber); 
    db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach(function(student) { print(student.name + "<p>"); }); 
} 

參考:Advanced Queries - MongoDB: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-{{skip%28%29}}

+0

我玩了更多,並意識到我並不真的需要第一個查詢。我只需要像這樣$ total_documents = $ collection-> find($ query,array(「_ id」)) - > count(); – luckytaxi 2010-06-10 13:31:16