Php 正在多次运行的查询

Php 正在多次运行的查询,php,mongodb,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 ($dataSe

我尝试在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){

}

?>
我看到查询在控制台中运行了7次? 这是我在做的蠢事吗?范围界定问题?或者我只是误解了MongoDB的工作原理

谢谢

发生这种情况是因为
$dataSet
是一个数组,而不是一个数组。
MongoCursor
是查询的表示形式。它将变成一个“按需”数组,这意味着当您在其上使用
foreach
时,
$dataSet
通过简单的查询转换成一个数组

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

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

编辑:请记住,
迭代器对数组
将整个结果集转换为内存中的数组。如果您有一个非常大的结果集,这可能会导致巨大和不必要的内存消耗。建议继续使用单个
foreach
调用,因为它一次只能将一行加载到内存中。

发生这种情况是因为
$dataSet
是一个数组,而不是一个数组。
MongoCursor
是查询的表示形式。它将变成一个“按需”数组,这意味着当您在其上使用
foreach
时,
$dataSet
通过简单的查询转换成一个数组

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

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

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

为什么要使用
$where
而不是
$races->find(数组('location'=>'SHEFFIELD')?单独使用
$where
会强制进行完整扫描。为什么要使用
$where
而不是
$races->查找(数组('location'=>'SHEFFIELD')?单独使用
$where
,强制进行完全扫描。