2017-07-17 13 views
0

私はPHPでMongoDBを使用しています。 findを実行すると、MongoDB \ Driver \ Cursorが返されます。MongoDB findカーソル対toArray繰り返しとnumリクエスト

検索されたデータを反復処理するより良い方法は何ですか?

foreach($cursor as $entry){} 

または各アプローチに送信されているどのように多くの要求のサーバーへ

foreach($cursor->toArray() as $entry){} 

? 複数の場合、1つのリクエストですべてのデータを取得する方法はありますか?

ありがとうございます。

答えて

1

MongoDBは、カーソルの繰り返しを開始するとすぐに、ドキュメントをバッチで返します(デフォルトのバッチサイズは101です)。最初の反復では、最初のバッチでドキュメントを取得するためにサーバにコールがヒットし、ドライバはこれらのドキュメントをローカルに格納します。その後の反復では、反復がバッチサイズに達するまでローカルから文書を提供します。したがって、102回目の反復ドライバでは、サーバにコールを送信して次のバッチを取得します。

foreach($cursor as $entry){} 

アプローチ2:

あなたはfind方法でオプションのパラメータbatchSizeを提供することにより、バッチサイズを設定することができ、より多くのヘルプがhere

アプローチ1を見つけることができます

foreach($cursor->toArray() as $entry){} 

$cursor->toArrayは、カーソルを反復して結果を配列に返すように実装されています。したがって、これらのアプローチのいずれかを使用した場合、サーバーと同じ数の呼び出しが行われます。唯一の違いは、のアプローチ2を使用して結果セットの単一の配列を取得することです。 2アプローチを使用しての

欠点:

  • 一度toArray方法で、あなたは、アレイからエントリを取得するときに1回、2回繰り返した結果セット。
  • 結果セットに多数のドキュメントがある場合、メモリの問題(メモリ不足)が発生する可能性があります。あなたの質問から

回答:あなただけのオプション提供することで、(明示的にbatchSizeを設定し、カーソル反復中にサーバーへのコール数を最小限に抑えたい場合は

アプローチ1は、実装する方が良いだろうパラメータbatchSizefind方法で)。

関連する問題