5

mongodb に対してクエリが実行されると、カーソルはメモリ内の結果セットをどのように処理しますか? カーソルは、クエリに一致するすべてのドキュメントを一度に取得しますか? または、一度に 1 つのドキュメントを取得しますか? またはそれらはバッファリングされていますか?または、私が知らない別の解決策がありますか?

バッファリングされたソリューションの場合、サーバー/クライアントにどのように保存されますか? クライアントがローカルに保持するデータの量は?

4

1 に答える 1

5

MongoDBのワイヤ プロトコルには、クエリを発行する際のバッチ サイズの仕様があります。

基本的な前提は、クライアント ドライバーがnumberToReturnフラグ付きのクエリを発行することです。クエリが に一致する場合、numberToReturnその番号のみがクライアントに返されます。

したがって、サーバーは実質的に 1 つの「バッチ」をクライアントに送信します。クライアントがバッチ全体を循環する場合、クライアントはgetmoreリクエストを発行し、次のバッチを受け取ります。その間、サーバーはすべての結果をメモリにロードする必要はなく、クライアントの要求を満たすのに十分なだけです。

PHP ドライバーは、この複雑さの多くを抽象化します。ドライバーで行うことは、次の項目を要求することだけであり、ドライバーはgetmore適切な場所でそれを処理します。

サイズに関しては、最大 BSON サイズまたは の小さい方になりますnumberToReturn。そのため、ドキュメントが大きすぎる場合は、最大 BSON サイズに達して、一度に大量のデータが送信されないようにすることができます。

詳細を確認するのに最適な場所は、実際のコードです。

于 2011-05-05T23:38:18.620 に答える