2012-06-05 2 views
7

Quando si esegue una query in MongoDb, è necessario ottenere un conteggio totale di tutte le corrispondenze, insieme ai documenti stessi come sottoinsieme limitato/paginato.mongodb ottiene il conteggio senza trovare il risultato

Posso raggiungere l'obiettivo con due query, ma non vedo come farlo con una query. Spero che esista una funzionalità di mongo che, in un certo senso, è equivalente a SQL_CALC_FOUND_ROWS, poiché sembra che l'overkill debba eseguire la query due volte. Qualsiasi aiuto sarebbe grande. Grazie!

MODIFICA: qui è il codice Java per fare quanto sopra.

 DBCursor cursor = collection.find(searchQuery).limit(10); 
    System.out.println("total objects = " + cursor.count()); 

risposta

3

non sono sicuro quale lingua si sta utilizzando, ma in genere è possibile chiamare un metodo count sul cursore che è il risultato di una query find e quindi utilizzare lo stesso cursore per ottenere i documenti stessi.

+0

grazie per il vostro aiuto, funziona come un fascino. Sto usando Java e il cursore ha un metodo di conteggio. – adamSpline

+7

Questo non è del tutto corretto. La domanda chiede come farlo con una * query *. L'uso di 'cursor.count()' in realtà solo delega la seconda query al driver client, ma la seconda query viene ancora eseguita. – Raman

2

Non è solo eccessivo eseguire la query due volte, ma c'è anche il rischio di incoerenza. La raccolta potrebbe cambiare tra le due query oppure ogni query potrebbe essere indirizzata a un peer diverso in un set di repliche, che potrebbe avere versioni diverse della raccolta.

La funzione count() sui cursori (nella shell JavaScript di MongoDB) esegue realmente un'altra query, è possibile visualizzarla digitando "cursor.count" (senza parentesi), quindi non è migliore dell'esecuzione di due query.

Nel driver C++, i cursori non hanno nemmeno una funzione di "conteggio". C'è "itcount", ma scorre solo sul cursore e recupera tutti i risultati, che non è quello che vuoi (per motivi di prestazioni). Il driver Java ha anche "itcount", e lì la documentazione dice che dovrebbe essere usato solo per i test.

Sembra che non ci sia modo di fare un "trovare un po 'e ottenere il conteggio totale" in modo coerente ed efficiente.