Php 尝试在mongodb游标上迭代两次-失败

Php 尝试在mongodb游标上迭代两次-失败,php,mongodb,Php,Mongodb,我正在对我的mongodb数据库执行查询。。。然后在前端逻辑中的两个独立点,我需要迭代结果以提取/显示不同的信息 问题 第二次尝试遍历时,我收到以下错误消息: 致命错误:未捕获MongoDB\Driver\Exception\LogicException:游标 无法在中生成多个迭代器 /var/www/localhost/htdocs/widgets/exception\u details.php:46 堆栈跟踪:0 后端代码 以下是在我的模型中查询数据库的逻辑: try{

我正在对我的mongodb数据库执行查询。。。然后在前端逻辑中的两个独立点,我需要迭代结果以提取/显示不同的信息

问题

第二次尝试遍历时,我收到以下错误消息:

致命错误:未捕获MongoDB\Driver\Exception\LogicException:游标 无法在中生成多个迭代器 /var/www/localhost/htdocs/widgets/exception\u 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>";
            }
        }
 }
任何提示都将不胜感激

谢谢

编辑1

作为测试,我将前端代码更改为使用rewind和next,如下所示:

$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();
 }

我得到了同样的结果。它第一次工作,但第二次爆炸时会显示相同的错误消息。

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

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

那他们为什么给你一个倒带的方法?我正在尝试你的答案。。。但我只是想问一下,他们呢?是你,正试图用迭代器包装游标。嗯。。。因此,如果您查看文档,它显式地引用了回放方法。如果您指的是该评论,则无论如何它都不是文档。文档是用户提供的注释之上的所有内容。页面上的所有其他内容都应被视为互联网上某个人的意见。为了理智起见,不要盲目相信用户贡献的内容。测试一下。游标实现了可遍历-不再。没有办法倒带它。
$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();
 }
    $rows = $m->executeQuery('widgets.play_summary', $query);
    return $rows->toArray();