mongodb に対してクエリが実行されると、カーソルはメモリ内の結果セットをどのように処理しますか? カーソルは、クエリに一致するすべてのドキュメントを一度に取得しますか? または、一度に 1 つのドキュメントを取得しますか? またはそれらはバッファリングされていますか?または、私が知らない別の解決策がありますか?
バッファリングされたソリューションの場合、サーバー/クライアントにどのように保存されますか? クライアントがローカルに保持するデータの量は?
mongodb に対してクエリが実行されると、カーソルはメモリ内の結果セットをどのように処理しますか? カーソルは、クエリに一致するすべてのドキュメントを一度に取得しますか? または、一度に 1 つのドキュメントを取得しますか? またはそれらはバッファリングされていますか?または、私が知らない別の解決策がありますか?
バッファリングされたソリューションの場合、サーバー/クライアントにどのように保存されますか? クライアントがローカルに保持するデータの量は?
MongoDBのワイヤ プロトコルには、クエリを発行する際のバッチ サイズの仕様があります。
基本的な前提は、クライアント ドライバーがnumberToReturn
フラグ付きのクエリを発行することです。クエリが に一致する場合、numberToReturn
その番号のみがクライアントに返されます。
したがって、サーバーは実質的に 1 つの「バッチ」をクライアントに送信します。クライアントがバッチ全体を循環する場合、クライアントはgetmoreリクエストを発行し、次のバッチを受け取ります。その間、サーバーはすべての結果をメモリにロードする必要はなく、クライアントの要求を満たすのに十分なだけです。
PHP ドライバーは、この複雑さの多くを抽象化します。ドライバーで行うことは、次の項目を要求することだけであり、ドライバーはgetmore
適切な場所でそれを処理します。
サイズに関しては、最大 BSON サイズまたは の小さい方になりますnumberToReturn
。そのため、ドキュメントが大きすぎる場合は、最大 BSON サイズに達して、一度に大量のデータが送信されないようにすることができます。
詳細を確認するのに最適な場所は、実際のコードです。