Я пытаюсь получить некоторые данные из коллекции Mongo, используя функцию aggregate, но это дает мне MongoCursorTimeoutException. Я пытаюсь выбрать только пятьдесят записей за раз, и коллекция имеет более 17 миллионов записей. Это делается из PHP, а мой код выглядит следующим образом:
$data = $my_collection->aggregate(array( array('$match'=>$filter_query), array('$group'=>array('_id'=>'$email')), array('$skip'=>$offset), array('$limit'=>$per_page) ));
и $ filter_query – это еще один массив, содержащий временную карту, и это похоже на
Array ( [timestamp] => Array ( [$gt] => 1383890400 [$lt] => 1384495200 ) )
Я не знаю, почему это происходит, поскольку я пытаюсь получить только 50 записей. Я думаю, что agrression выполняется после выбора всех записей и вызывает ошибку. Любой лучший способ сделать это, кроме агрессии?
Я могу установить тайм-аут на -1, но является ли это хорошим вариантом, поскольку драйвер будет ждать навсегда, чтобы получить первоначальный ответ?
Чтобы установить параметр таймаута для агрегатной функции, вы должны использовать функцию команды экземпляра объекта MongoDB. Например:
$result = $database->command( array( 'aggregate' => $my_collection, 'pipeline' => array( array('$match' => $filter_query), array('$group' => array('_id'=>'$email')), array('$skip'=>$offset), array('$limit'=>$per_page) ) ), array( 'timeout' => $timeout ) );
Для получения дополнительной информации см. Документацию