我有一个查询在一个巨大的集合中查找数据(超过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
有什么想法吗?
答案 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。