2011-05-05 2 views
5

Lorsque des requêtes sont effectuées sur mongodb, comment son curseur gère-t-il le jeu de résultats en mémoire? Est-ce que le curseur récupère tous les documents qui correspondent à la requête, à la fois? ou récupère-t-il 1 document à la fois? ou sont-ils tamponnés? ou y a-t-il une solution différente que je ne connais pas?Comment est-ce que le Curseur de Curseur PHP MongoDB un ensemble de résultats?

Si elle est une solution tamponnée, comment sont-ils stockés sur le serveur/client? Combien de données le client garde-t-il localement?

+0

Mémoire - quelle mémoire, serveur ou client? Un curseur ne récupère jamais les documents, c'est un curseur. Buffered - encore où? Sur le client ou le serveur? Ou êtes-vous seulement intéressé par le client à partir de PHP? – hakre

+0

Les deux, vraiment. J'imagine que le serveur doit stocker le résultat quelque part. Et, peut-être que je suis confus quant au travail du curseur - mais le curseur agit comme ma "passerelle" vers les données, donc il doit l'obtenir de quelque part, et quelque part doit le stocker. J'essaie juste d'apprendre/comprendre où les données sont stockées et comment il est accédé/tamponné par le client PHP. –

+0

Un curseur permet au client de naviguer dans le jeu de résultats disponible sur le serveur. Donc vous interrogez 500 documents, le serveur n'a qu'à dire, ici le curseur. le client dit merci et utilise ensuite les curseurs pour naviguer vers quelque part dans cet ensemble. Puis le client dit: Donnez-moi le document à l'endroit où le curseur pointe. Le serveur dit: bien je connais ce curseur, donc je peux vous donner un document. Au moins c'est comme ça que je comprends un curseur. Le curseur lui-même ne va jamais mais est utilisé dans la communication entre le client et le serveur. – hakre

Répondre

5

Le MongoDB wire protocol a des spécifications pour la taille des lots lors de l'émission d'une requête.

Le principe de base est que le pilote client émet une requête avec numberToReturn drapeau. Si la requête correspond au numberToReturn, seul ce nombre est renvoyé au client. Par conséquent, le serveur envoie effectivement un "lot" au client. Si le client parcourt tout le lot, le client émet une demande getmore et reçoit le lot suivant. En attendant, le serveur n'a pas besoin de charger tous les résultats en mémoire, juste assez pour satisfaire la demande du client.

Le pilote PHP extrait une grande partie de cette complexité. Tout ce que vous faites avec le pilote est de demander l'article suivant et le conducteur va gérer le getmore le cas échéant.

En termes de taille, vous obtiendrez la plus petite taille Max BSON ou numberToReturn. Donc, si les documents sont trop gros, vous pouvez atteindre la taille Max BSON pour éviter d'envoyer trop de données à la fois.

Le meilleur endroit pour obtenir davantage de détails est the actual code.

Questions connexes