Ошибка тайм-аута курсора на курсоре MongoDb - PullRequest
4 голосов
/ 23 августа 2010

Я только что начал использовать mongoDb в качестве бэкэнда для PHP.

Я просто использую запрос find () для одной из моих потребностей. Я хочу только первые 100 результатов, но также хочу получить общее количество доступных результатов. Я пытаюсь это.

    $cursor = $this->dbReference->dbName->find($query);
    if($count != 0)
    {
            $cursor->skip($startIndex);
            $cursor->limit($count);
    }
    $totalCount = $cursor->count();

    $entries = array();
    while ($cursor->hasNext())
    {
            $cursor->next();
            $entry = $cursor->current();
            array_push($entries , $entry);
    }

Теперь проблема в том ... его результат поиска содержит более 50K результатов. Но я получаю только 100 одновременно. Я использую $ cursor-> count () для получения общего количества доступных строк результата. в этой строке ошибка показывает, что «Курсор истек». Кто-нибудь может подсказать, в чем проблема? или какая альтернатива для поиска общего количества результатов поиска.

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 13 июня 2012

Вы можете решить проблему тайм-аута курсора, добавив этот код до find():

MongoCursor::$timeout = -1;
$cursor = $this->dbReference->dbName->find($query);
1 голос
/ 07 сентября 2010

Я только что попробовал это с 100 000 простых документов.$totalCount для меня всегда 100000, независимо от того, установлены ли $count и $startIndex (это правильное поведение).$entries содержит все 100000 записей.На моей локальной установке вся операция занимает около 3 секунд.

Используете ли вы удаленную базу данных?Вполне возможно, что причиной задержки является сеть, а не MongoDB.

Какого размера ваши документы?Объем данных может влиять на скорость.

0 голосов
/ 16 августа 2012

Я обнаружил, что -> count () также уносит время выполнения, пока оно не истечет. Для меня лучше всего использовать find (), а затем поместить нужный элемент в курсоре в массив, используя цикл foreach. После этого выполните array_count_values ​​() для этого массива. Кажется, тоже немного быстрее.

Спасибо за MongoCursor :: $ timeout = -1, потому что я думаю, что это действительно помогло и в моей ситуации.

Волшебно, что больше нет ужасных сообщений о тайм-аутах.

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