Как обработать запросы разбиения на страницы правильно с mongodb и php?

Я делаю это правильно? Я пошел для рассмотрения некоторого старого кода PHP w/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, который привел к лучше выглядящему коду.;-) Я пытался минимизировать прохождения в DB, но о хорошо, надо надеяться, это не получает удар производительности. Моя другая попытка состояла в том, чтобы считать число элементов в массиве, но быстро узнала, что это не будет работать, так как параметры $limit и $skip дали бы ЕГО общее количество документов.

$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);
18
задан luckytaxi 10 June 2010 в 13:40
поделиться

2 ответа

Поскольку результатом 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;

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

22
ответ дан 30 November 2019 в 08:43
поделиться

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

Вот пример с пагинацией:

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}}

1
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: