我正在尝试在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
答案 0 :(得分:1)
这是因为$dataSet
是MongoCursor
,而不是数组。 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
调用,因为它只会一次将一行加载到内存中。