2010-08-23 78 views
4

我刚开始使用mongoDb作为我的PHP后端。光标MongoDb游标超时错误

我简单地使用find()查询来满足我的一个需求。我只想要前100个结果,但也想获得全部可用结果。我正在尝试这个。

$cursor = $this->dbReference->dbName->find($query); 
    if($count != 0) 
    { 
      $cursor->skip($startIndex); 
      $cursor->limit($count); 
    } 
    $totalCount = $cursor->count(); 

    $entries = array(); 
    while ($cursor->hasNext()) 
    { 
      $cursor->next(); 
      $entry = $cursor->current(); 
      array_push($entries , $entry); 
    } 

现在的问题是..牛逼 他的搜索结果中只包含超过50K的结果。但我一次只能检索100个。 我使用$ cursor-> count()获取可用结果行的总数。 就此行错误显示“光标超时”。请谁能告诉我最新的问题?或者找到搜索结果总数的替代方法。

在此先感谢。

+0

新版本的mongodb解决了这个问题,并且与laravel和nodejs工作良好 – 2015-11-21 04:51:46

回答

1

我刚刚用100,000个简单文档试了一下。对我而言,$totalCount总是100000,无论是否设置了$count$startIndex(这是正确的行为)。 $entries包含全部100000个条目。整个操作在我的本地设置上大约需要3秒。

您使用远程数据库吗?网络有可能导致超时而不是MongoDB。

你的文件大小是多少?数据量可能会影响速度。

+0

@danielwood是的,我使用远程数据库,但它也在本地网络(Intranet)上。可能是因为$ cursor-> count();并且$ cursor-> count()也会增加执行时间。如果我没有使用$ cursor-> count()它表现得很快,就像你说的那样。 – 2010-09-07 17:56:28

7

您可以通过find()之前添加以下代码解决光标超时问题:

MongoCursor::$timeout = -1; 
$cursor = $this->dbReference->dbName->find($query); 
+0

'MongoCursor :: $ timeout'静态属性已弃用 – Mohammad 2016-09-15 06:56:07

0

我发现 - >计数()也吹出的执行时间,直到超时。对我来说更好的是只使用find(),然后使用foreach循环将所需的光标放入数组中。 之后,在该数组上做一个array_count_values()。似乎也快一点。

感谢MongoCursor :: $ timeout = -1,我认为它对我的情况确实有帮助。

神奇的是,没有更可怕的超时消息。