12

mongodb からデータを取得する php スクリプトを実行しています。非常に巨大なデータベースがあり、この例外が発生しています..私のmongodbバージョンは1.6.5です

PHP Fatal error:  Uncaught exception 'MongoCursorTimeoutException' 
with message 'cursor timed out 
(timeout: 30000, time left: 0:0, status: 0)

私のクエリはこのようなものです

private function executeRegex($start_date, $end_date, $source, $collection, $db)
  {
    $criteria = array(
        'date' => array(
          '$gte' => new MongoDate(strtotime($start_date)),
          '$lt' => new MongoDate(strtotime($end_date))
          ),  
        'uid'=> array(
          '$ne' => '-',
          ),  
        'source' => new MongoRegex($source)
        );  
    $value = $db->command(array('distinct' => $collection, 'key' => 'uid', 'query' => $criteria)); 
    return count($value['values']);
  }

この例外が発生しないように、タイムアウトを無限に設定するにはどうすればよいですか

4

4 に答える 4

12

カーソルにタイムアウトを設定するためのドキュメントは次のとおりです。

$cursor = $collection->find()->timeout(n);

このcommandメソッドはカーソルを返さず、配列を返します。

コマンド methodのドキュメントを見ると、実際には次の単なるラッパーであることがわかります。

public function command($data) {
    return $this->selectCollection('$cmd')->findOne($data);
}

それはあなたを正しい方向に導くはずです。

于 2011-04-06T06:50:09.103 に答える
5

PHP ドライバーは、タイムアウトを設定するコマンド メソッドの 2 番目の引数をサポートしています。

これは、次のことを行う必要があることを意味します。

$value = $db->command(
    array('distinct' => $collection, 'key' => 'uid', 'query' => $criteria),
    array('timeout' => 10000000000)
);

これで問題が解決するはずです。

于 2013-11-13T18:23:56.050 に答える
2

最初のステップで、mongodbがクエリでどのように機能するかを確認する必要があると思います

db.collection.find(...).explain()

そして、必要に応じて、指定されたフィールドにインデックスを追加します

db.collection.ensureIndex(...)

そして、クエリが最適な場合にのみ、タイムアウトを設定します: -1

于 2013-06-04T07:53:36.097 に答える