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){

}

?>

これを実行してコンソールを見ると、クエリが1回実行されているのがわかります。

foreachループを次のように別のループ内にネストするように変更すると、次のようになります。

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

    }
}

コンソールでクエリが7回実行されているのがわかりますか?これは私がやっている愚かなことですか?スコーピングの問題?それとも、MongoDBがどのように機能するのか誤解していますか?

ありがとうAH

4

1 に答える 1

1

これは、が配列ではなく、であるために発生$dataSetMongoCursorます。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一度に1つの行のみをメモリにロードするため、1回の呼び出しに固執することをお勧めします。

于 2012-10-29T13:44:12.290 に答える