2011-05-05 11 views
5

Cuando se hacen consultas a mongodb, ¿cómo se ocupa el cursor del conjunto de resultados en la memoria? ¿El cursor recupera todos los documentos que coinciden con la consulta, a la vez? o ¿recupera 1 documento a la vez? o son amortiguadas? o hay una solución diferente que no conozco?¿Cómo almacena el Cursor del controlador PHP MongoDB un conjunto de resultados?

Si se trata de una solución de búfer, ¿cómo se almacenan en el servidor/cliente? ¿Cuantos datos guarda el cliente localmente?

+0

Memoria: ¿qué memoria, servidor o cliente? Un cursor nunca recupera documentos, es un cursor. Buffered - ¿de nuevo dónde? En el cliente o servidor? ¿O solo le interesa el cliente a partir de PHP? – hakre

+0

Ambos, realmente. Me imagino que el Servidor tiene que almacenar el resultado en alguna parte. Y, tal vez estoy confundido en cuanto al trabajo del cursor, pero el cursor actúa como mi "puerta de entrada" a los datos, por lo que tiene que obtenerlo de algún lado, y que en algún lugar tiene que almacenarlo. Solo intento aprender/averiguar dónde se almacenan los datos y cómo el cliente de PHP accede a ellos/los almacena en el buffer. –

+0

Un cursor permite al cliente navegar a través del conjunto de resultados disponible en el servidor. Entonces consulta 500 documentos, el servidor solo necesita decir, aquí el cursor. el cliente agradece y luego usa los cursores para navegar a algún lugar dentro de ese conjunto. Entonces el cliente dice: Dame el documento en el lugar donde apunta el cursor. El servidor dice: bien, conozco ese cursor, así que puedo darte un documento. Al menos así entiendo un cursor. El cursor nunca se recupera, pero se utiliza en la comunicación entre el cliente y el servidor. – hakre

Respuesta

5

El MongoDB wire protocol tiene especificaciones para el tamaño del lote cuando se realiza una consulta.

La premisa básica es que el controlador de cliente emite una consulta con numberToReturn bandera. Si la consulta coincide con el numberToReturn, solo ese número se devuelve al cliente.

De modo que el servidor efectivamente envía un "lote" al cliente. Si el cliente realiza un ciclo en todo el lote, el cliente emite una solicitud getmore y recibe el siguiente lote. Mientras tanto, el servidor no necesita cargar todos los resultados en la memoria, solo lo suficiente para satisfacer la solicitud del cliente.

El controlador PHP elimina gran parte de esta complejidad. Todo lo que haga con el controlador es solicitar el siguiente artículo y el controlador manejará el getmore cuando corresponda.

En términos de tamaño, usted recibirá la más pequeña de tamaño máximo BSON o numberToReturn. Entonces, si los documentos son demasiado grandes, puede golpear el tamaño máximo de BSON para evitar enviar demasiados datos a la vez.

El mejor lugar para obtener más detalles es the actual code.

Cuestiones relacionadas