2010-08-23 3 views
4

Я только что начал использовать mongoDb в качестве моего backend для PHP.Курсор Исправлена ​​ошибка на курсоре MongoDb

Я просто использую запрос 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); 
    } 

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

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

+0

Новая версия mongodb разрешает эту проблему, и работает хорошо с laravel и nodejs –

ответ

1

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

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

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

+0

@ danielwood Да, я использую удаленную базу данных, но она также находится в локальной сети (Intranet). Возможно, проблема будет связана с $ cursor-> count(); А также $ cursor-> count() увеличивает время выполнения. Если я не использую $ cursor-> count(), он работает быстро, как сказал u. –

7

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

MongoCursor::$timeout = -1; 
$cursor = $this->dbReference->dbName->find($query); 
+0

Статическое свойство MongoCursor :: $ timeout устарело – Mohammad

0

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

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

Волшебным образом не существует более ужасных сообщений об ошибках.