试图迭代两次mongodb游标 - 失败

时间:2017-05-09 12:59:44

标签: php mongodb

我正在对我的mongodb数据库执行查询...然后在我的前端逻辑中的两个单独的位置,我需要遍历结果以提取/显示不同的信息。

问题

我第二次尝试迭代,我收到以下错误消息:

  

致命错误:未捕获的MongoDB \ Driver \ Exception \ LogicException:游标   不能产生多个迭代器   /var/www/localhost/htdocs/widgets/exception_details.php:46   堆栈跟踪:#0

后端代码

这是在我的模型中查询数据库的逻辑:

    try{
        $id = new \MongoDB\BSON\ObjectId($docid);
        $filter = ['_id' => $id];
        $options = [];
        $query = new \MongoDB\Driver\Query($filter, $options);
        $rows = $m->executeQuery('widgets.play_summary', $query);
        return $rows;
    } catch (Exception $e) {
        echo 'Exception:'. $e->getMessage();
        return false;
    }

前端逻辑

这是尝试迭代的逻辑。

第一次:

foreach ($rows as $id=>$value) {
        if ( count($value->unreachable_servers > 0) ) {
            foreach($value->unreachable_servers as $key=>$value) {
                echo "<tr>";
                echo "<td>$value</td>";
                echo "</tr>";
            }
        }
 }

然后,我尝试这样做:

$it = new IteratorIterator($rows);  //line 46
$it->rewind();  
foreach ($rows as $id=>$value) {
    if ( count($value->failed_plays > 0) ) { 
            foreach($value->failed_plays as $key=>$value) {
                    echo "<tr>";
                    echo "<td>$value</td>";
                    echo "</tr>";
            }
    }
 }

其他信息

注释掉以下几行会给出完全相同的错误,但只是在第48行而不是第46行:

$it = new IteratorIterator($rows);
$it->rewind();  

任何提示将不胜感激。

感谢。

编辑1

作为测试,我将前端代码更改为使用倒带,然后将其改为:

$it = new \IteratorIterator($rows);
$it->rewind(); 
//foreach ($rows as $id=>$value) {
while($value = $it->current()) {
        if ( count($value->unreachable_servers > 0) ) {
            foreach($value->unreachable_servers as $key=>$value) {
                echo "<tr>";
                echo "<td>$value</td>";
                echo "</tr>";
            }
        }
  $it->next();
 }

对于第二个循环:

$it = new IteratorIterator($rows);
$it->rewind();  
//foreach ($rows as $id=>$value) { 
while($value = $it->current()) {
    if ( count($value->failed_plays > 0) ) { 
            foreach($value->failed_plays as $key=>$value) {
                    echo "<tr>";
                    echo "<td>$value</td>";
                    echo "</tr>";
            }
    }
    $it->next();
 }

我得到了相同的结果。它第一次工作,但第二次使用相同的错误信息进行轰炸。

1 个答案:

答案 0 :(得分:0)

光标不能迭代两次。如果它适合内存,则将其获取到数组中:

    $rows = $m->executeQuery('widgets.play_summary', $query);
    return $rows->toArray();