jenssegers / laravel-mongodb中的MongoCursorTimeoutException

时间:2015-07-02 16:57:18

标签: mongodb laravel

我有一个查询在一个巨大的集合中查找数据(超过48M),但即使我向其添加timeout=-1,它仍会抛出MongoCursorTimeoutException异常..

return \DB::connection('mongodb')->collection('stats')->timeout(-1)
    ->where('ip','=',$alias)
    ->where('created_at','>=', new \DateTime( $date ) )
    ->where('created_at','<=', new \DateTime( $date . ' 23:59:59' ) )
    ->count();

我正在使用此库:https://github.com/jenssegers/laravel-mongodb

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

为PHP MongoDB驱动程序v1.5.7提交了一个问题PHP-1249 - MongoCursor::count() should use cursor's socket timeout,该问题已于2014年10月在v1.5.8中修复。

来自支持的reply

  

稍微查看代码,似乎套接字超时和maxTimeMS都没有传递给count命令。

     

如果您需要立即解决问题,您现在应该可以使用MongoDB::command()(这可以支持两种超时)。

其中一位用户发布的解决方法是:

$countComand = $mongo->command(
    array(
        'count' => 'collection',
        'query' => $query
    ),
    array('socketTimeoutMS' => -1)
);


if($countComand['ok']){
    $count = $countComand['n'];
} else {
    // ... error ...
}

似乎laravel-mongodb不使用MongoDB::command()。您必须在没有where方法帮助的情况下明确编写查询,如上所示,或升级到v.1.5.8。