查询正在多次运行

时间:2012-10-29 13:33:28

标签: php mongodb

我正在尝试在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应该如何工作?

由于 AH

1 个答案:

答案 0 :(得分:1)

这是因为$dataSetMongoCursor,而不是数组。 MongoCursor是查询的表示。它将被“按需”转换为数组,这意味着当您在其上使用foreach时,只需查询即可将$dataSet转换为数组。

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

$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调用,因为它只会一次将一行加载到内存中。