Подтвердить что ты не робот

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

Я делаю это правильно? Я пошел посмотреть на какой-то старый 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);
4b9b3361

Ответ 1

Так как результат 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;

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

Ответ 2

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

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

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