2010-06-09 7 views
17

Czy robię to dobrze? Poszedłem do starego kodu PHP w/MySQL i udało mi się go uruchomić, ale zastanawiam się, czy jest o wiele "czystszy" i "szybszy" sposób na osiągnięcie tego.Jak poprawnie obsługiwać zapytania dotyczące stronicowania za pomocą mongodb i php?

Najpierw musiałbym uzyskać całkowitą liczbę „dokumentów”

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

// Zapytanie zapełnić tablicę więc mogę wyświetlić z paginacji

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

Moje pytanie brzmi, czy mogę uruchomić zapytanie w jednym ujęciu? Zasadniczo dwukrotnie uruchamiam to samo zapytanie, z wyjątkiem tego, że po raz drugi przekazuję tę wartość, aby pomijać rekordy.

- Nowy kod ...

Ok, chyba że ktoś zna inny sposób to zrobić (jeśli to możliwe), mam zamiar powiedzieć, że nie jest to wykonalne. Powiedziawszy to, zmieniłem sposób, w jaki prowadzę moje zapytania za pośrednictwem mongodb, co przyniosło lepiej wyglądający kod. ;-) Próbowałem zminimalizować podróże do DB, ale mam nadzieję, że to nie potrwa. Moją drugą próbą było policzenie liczby elementów w tablicy, ale szybko okazało się, że to nie zadziała, ponieważ parametry $ limit o wartości $ & $ podadzą całkowitą liczbę dokumentów.

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

Odpowiedz

20

Od wyniku find() -> Limit() -> przejdź() jest Mongo_Cursor nie trzeba wykonywać rzeczywiste zapytanie dwukrotnie.

Poniższa powinien działać także:

$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 ja pierwszy misread pytanie, myślałem, że nie wiedział o limicie & pominąć.

+2

nie powinien pominąć przyjść przed limitem? – Chamila

1

Tak, masz rację. I możesz uruchomić zapytanie za jednym razem.

Oto przykład stronicowania:

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

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

+0

Grałem z nim trochę więcej i zdałem sobie sprawę, że tak naprawdę nie potrzebuję pierwszego zapytania. Potrzebuję czegoś takiego $ total_documents = $ collection-> find ($ query, array ("_ id")) -> count(); – luckytaxi

Powiązane problemy