Php 正在多次运行的查询
我尝试在PHP中运行以下代码来查询MongoDB: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
<?
$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
,强制进行完全扫描。