Как правильно обрабатывать запросы на нумерацию страниц с помощью mongodb и php? - PullRequest
18 голосов
/ 10 июня 2010

Я правильно делаю? Я пошел посмотреть на какой-то старый код PHP с MySQL и мне удалось заставить его работать, однако мне интересно, есть ли гораздо более «чистый» и «более быстрый» способ сделать это.

Сначала мне нужно получить общее количество «документов»

$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, что привело к получению лучшего кода. ;-) Я пытался свести к минимуму количество посещений БД, но, надеюсь, это не повлияет на производительность. Другой моей попыткой было подсчитать количество элементов в массиве, но быстро обнаружил, что это не сработает, так как параметры $ limit & $ skip дадут 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);

Ответы [ 2 ]

22 голосов
/ 10 июня 2010

Поскольку результат find () -> limit () -> skip () является 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;

Кстати, я сначала неправильно прочитал ваш вопрос, я думал, что вы не знали о лимите и пропустите.

1 голос
/ 10 июня 2010

Да, вы делаете правильно. И вы можете запустить запрос в один выстрел.

Вот пример подкачки:

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

Ссылка: Расширенные запросы - MongoDB: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-{{skip%28%29}}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...