phplib - php mongodb tutorial
¿Cómo manejar las consultas de paginación correctamente con mongodb y php? (2)
¿Lo estoy haciendo bien? Fui a ver un código PHP antiguo con MySQL y logré que funcionara, sin embargo, me pregunto si hay una forma mucho más "limpia" y "más rápida" de lograrlo.
Primero necesitaría 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 rellenar la matriz para que pueda 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 sola vez? Básicamente, estoy ejecutando la misma consulta dos veces, excepto la segunda vez que estoy pasando el valor para saltar entre los registros.
-- Nuevo código ...
Ok, a menos que alguien sepa de otra manera de hacer esto (si es posible), voy a decir que no es factible. Dicho esto, cambié la forma en que ejecuto mis consultas a través de mongodb, que produjo un código con mejor aspecto. ;-) Estaba tratando de minimizar los viajes al DB, pero bueno, espero que esto no tenga un impacto en el rendimiento. Mi otro intento fue contar la cantidad de elementos en la matriz, pero rápidamente descubrí que no funcionaría, ya que los parámetros $ limit y $ skip darían la cantidad total de documentos de ITS.
$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);
Como el resultado de find () -> limit () -> skip () es un Mongo_Cursor, no tiene que ejecutar la consulta real dos veces.
Lo siguiente debería funcionar también:
$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;
Por cierto, primero leí mal tu pregunta, pensé que no sabías acerca de limitar y omitir.
Sí, lo estás haciendo bien. Y puedes ejecutar la consulta de una sola vez.
Aquí hay 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>"); } );
}