MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongo con java:trova query con batchsize

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 ).