Il DBCursor
consente di scorrere l'insieme di documenti ritenuti rilevanti per la query
da passare a find()
metodo. Recupera pigramente questi documenti dal database sottostante in blocchi di batchSize .
Quindi, con la dimensione batch predefinita (101, IIRC) restituirà i primi 101 documenti al tuo client e poi mentre il codice del tuo client scorrerà oltre il 101° documento, prenderà (dietro le quinte) i successivi 101 documenti e così via fino a qualsiasi si verifica prima una delle seguenti:
- Tutti i documenti rilevanti per la tua richiesta vengono restituiti, ovvero il cursore è esaurito
- Il tuo client interrompe l'iterazione
Lo stesso vale quando imposti un batchSize esplicito quindi nel tuo caso quando imposti batchSize=500
, il find()
call restituisce un DBCursor
che contiene (al massimo) 500 documenti e se c'erano più di 500 documenti corrispondenti alla tua query, mentre ripeti oltre il 500° documento, il driver Java MongoDB prenderebbe (dietro le quinte) il batch successivo.
Hai affermato...
... se ricevi solo 500 documenti, hai interrotto l'iterazione dopo 500 o solo 500 documenti sono stati ritenuti rilevanti per la tua query
.
Puoi vedere quanti documenti sono rilevanti per la tua query utilizzando count()
metodo. Ad esempio:
int count = collection.find(query).count();
Puoi anche prendere tutti i documenti rilevanti per la tua richiesta in una volta senza utilizzare un DBCursor
così...
List<DBObject> obj = collection.find(query).toArray();
... anche se ovviamente questo potrebbe avere implicazioni per l'heap della tua applicazione poiché comporterebbe che ogni documento che soddisfa i tuoi criteri venga archiviato nell'heap nel tuo client (piuttosto che l'approccio più amichevole per la memoria di leggerli in batch tramite il DBCursor
).