1

我正在尝试在 PHP 中运行以下代码来查询 MongoDB:

<?

$m = new Mongo(); // connect

$dogs = $m->dogs;
$races = $dogs->newdogs;

$js = "function() {
    return this.location == 'SHEFFIELD'
}";

$dataSet = $races->find(array('$where' => $js));

foreach ($dataSet as $r){

}

?>

当我运行它并观察控制台时,我看到查询正在运行一次。

当我将 foreach 循环更改为嵌套在另一个循环中时,如下所示:

foreach(range(1,5) as $test){
    foreach ($dataSet as $r){

    }
}

我看到查询在控制台中运行了 7 次?这是我在做的愚蠢的事情吗?范围界定问题?还是我只是误解了 MongoDB 应该如何工作?

谢谢啊

4

1 回答 1

1

发生这种情况是因为$dataSet它是一个MongoCursor,而不是一个数组。AMongoCursor是查询的表示。它会“按需”变成一个数组,也就是说当你在它上面使用foreach的时候,$dataSet通过简单的查询就可以变成一个数组。

由于您在另一个循环MongoCursor中执行此操作,因此每次遇到foreach. 如果你不想要这种行为,你可以使用iterator_to_array,因为 aMongoCursor只是一个迭代器:

$executed = iterator_to_array($dataSet); // Actual query execution
foreach($executed as $r) {               // Iterate the array, not the iterator
    // Hic sunt ponies
}

编辑:请记住,iterator_to_array将整个结果集转换为内存中的数组。如果您有一个非常大的结果集,这可能会导致大量且不必要的内存消耗。建议坚持一次foreach调用,因为它一次只会将一行加载到内存中。

于 2012-10-29T13:44:12.290 回答