jenssegers/laravel-mongodb中的MongoCursorTimeoutException异常

8

我有一个查询需要在一个超过 4800 万的大型集合中查找数据。即使我给它添加了 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,有什么想法吗?

48M不算太大。你在ipcreated_at上有索引吗?(我对Laravel一无所知,所以无法帮助你解决超时异常触发的问题...) - Jorge Aranda
1个回答

1

有一个问题PHP-1249 - MongoCursor::count() should use cursor's socket timeout提交给了PHP MongoDB驱动程序v1.5.7,这个问题在2014年10月的v1.5.8中得到了解决。

支持团队的回复:

经过代码调查,似乎套接字超时和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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接