2010-06-09 28 views
17

¿Estoy haciendo esto bien? Fui a ver un viejo código PHP con MySQL y me las he arreglado para hacer que funcione, sin embargo, me pregunto si hay una manera mucho más "limpia" y "más rápida" de lograr esto.¿Cómo manejar las consultas de paginación correctamente con mongodb y php?

Primero tendría que obtener el número total de "documentos"

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

// consulta para poblar matriz de modo que puede mostrar con paginación

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

Mi pregunta es, ¿Puedo ejecutar la consulta de una vez? Básicamente ejecuto la misma consulta dos veces, excepto la segunda vez que paso el valor para saltar entre registros.

- Nuevo código ...

Ok, a menos que alguien sabe de otra manera de hacer esto (si es posible), voy a decir que no es factible. Dicho esto, cambié la manera en que realizo mis consultas a través de mongodb, lo que arrojó un código de mejor apariencia. ;-) Estaba tratando de minimizar los viajes a la base de datos, pero espero que esto no tenga un impacto en el rendimiento. Mi otro intento fue contar la cantidad de elementos en la matriz, pero me di cuenta rápidamente de que no funcionaría, ya que los $ límite & $ omitirían los parámetros darían su número total de documentos.

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

Respuesta

20

Puesto que el resultado de find() -> límite() -> skip() es una Mongo_Cursor que no tiene que ejecutar la consulta real dos veces.

Lo siguiente debe funcionar tan bien:

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

cierto que primero interpretan mal su pregunta, pensé que no sabía sobre el límite de & saltar.

+2

no debe saltar venir antes de límite? – Chamila

1

Sí, estás haciendo lo correcto. Y puede ejecutar la consulta de una vez.

Aquí está un ejemplo de paginación:

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

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

+0

Jugué un poco más y me di cuenta de que realmente no necesitaba la primera consulta. Solo necesito algo como esto $ total_documents = $ collection-> find ($ query, array ("_ id")) -> count(); – luckytaxi

Cuestiones relacionadas