2015-07-02 123 views
8

我有一個查詢看起來了數據在一個巨大的集合(超過48M),但即使我添加timeout=-1給它,它仍然會拋出異常MongoCursorTimeoutException ..MongoCursorTimeoutException在jenssegers/laravel-MongoDB的

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

48M不是太大。你有'ip'和'created_at'的索引嗎? (我對laravel一無所知,所以我不能幫你用超時異常觸發器......) –

回答

1

沒有提交其固定在十月v1.5.8 PHP的MongoDB驅動程序v1.5.7的問題PHP-1249 - MongoCursor::count() should use cursor's socket timeout,2014年

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。

+0

非常感謝 – Broshi