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

21

MongoCursor::$timeout = -1;

在您的 php 代码中输入上述行。这为所有查询设置超时。最良好的问候,

于 2013-10-01T07:42:43.417 回答
12

这是在 cursor 上设置超时的文档。

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

command方法不返回游标,而是返回数组。

如果您查看command method的文档,您会发现它实际上只是以下内容的包装器:

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

这应该让你朝着正确的方向前进。

于 2011-04-06T06:50:09.103 回答
5

PHP 驱动程序支持在命令方法中使用第二个参数来设置超时。

这意味着您应该执行以下操作:

$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 回答