2010-06-09 12 views
17

क्या मैं यह सही कर रहा हूं? मैं कुछ पुराने PHP कोड w/MySQL को देखने के लिए गया था और मैंने इसे काम करने में कामयाब रहा है, हालांकि मैं सोच रहा हूं कि इसे पूरा करने के लिए "क्लीनर" और "तेज़" तरीका है या नहीं।मैगोडब और 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)); 

मेरा प्रश्न है, मैं चला सकते हैं की कुल संख्या प्राप्त करने की आवश्यकता होगी एक शॉट में सवाल? मैं मूल रूप से दो बार एक ही क्वेरी चला रहा हूं, दूसरी बार जब मैं रिकॉर्ड के बीच छोड़ने के लिए मूल्य पास कर रहा हूं।

- नई कोड ...

ठीक है, जब तक कि कोई एक और तरीका यह करने के लिए (यदि यह संभव है) के जानता है, मैं यह संभव नहीं है कहने के लिए जा रहा हूँ। इसके साथ ही, मैंने जिस तरह से मैंगोडब के माध्यम से अपने प्रश्नों को चलाया, वैसे ही बदल दिया, जिसने बेहतर दिखने वाला कोड दिया। ;-) मैं डीबी के लिए यात्रा को कम करने की कोशिश कर रहा था, लेकिन ओह उम्मीद है कि यह प्रदर्शन हिट नहीं लेता है। मेरा दूसरा प्रयास सरणी में तत्वों की संख्या को गिनना था, लेकिन जल्दी से पता चला कि $$ स्किप पैरामीटर के बाद से काम नहीं करेगा, यह कुल संख्या में दस्तावेज़ों को देगा।

$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; 

btw मैं पहली बार अपने प्रश्न पढ़ने में भूलना, मैंने सोचा कि आप सीमा & छोड़ के बारे में पता नहीं था।

+2

सीमा से पहले आने को छोड़ नहीं करना चाहिए? – Chamila

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 = $ संग्रह-> ढूंढें ($ क्वेरी, सरणी ("_ आईडी")) की आवश्यकता है -> गिनती(); – luckytaxi

संबंधित मुद्दे