Come ha detto @Remon, count() deve eseguire la scansione di tutti i documenti corrispondenti alla query/filtro. È O (n) dove n è il numero di documenti che corrisponderanno all'indice o il numero di documenti nella raccolta se il campo non è indicizzato.
In questi casi, in genere si desidera rivedere il requisito. Hai davvero bisogno di un numero preciso per il risultato 10161684? Se la precisione è importante, è necessario conservare un contatore separato per la query specifica.
Ma nella maggior parte dei casi, la precisione non è importante. E 'uno dei due:
- Non ti importa se si tratta di 10 milioni o 10,2 milioni, ma l'ordine di grandezza è importante, vale a dire, vi preoccupate se si tratta di 8 milioni o 10 milioni di euro.
- Ti interessa solo il numero preciso se è piccolo. Ad esempio, ti interessa sapere che ci sono 44 risultati o 72. Ma una volta che va oltre, per esempio, 1000, puoi semplicemente dire "Più di 1000 oggetti" trovati all'utente.
Nelle mie app, ho trovato che la seconda opzione è ciò che voglio. Quindi, limito anche la query count(), in modo che il conteggio si fermi quando raggiunge un limite. In questo modo:
db.datasources.find({nid: 19882}).limit(1000).count(true)
Per l'utente, io espongo '1000 o più risultati' se il numero è 1000, in caso contrario, visualizzo il numero esatto.
Per quanto riguarda la prima opzione ... Non ho ancora pensato a una soluzione accurata.
Anche se hai un indice su nid, potrebbe non essere residente in memoria. Cosa succede se si esegue la query una seconda volta, è più veloce? –
No, è ancora lento –
Quanto dura la prima query? Sei sicuro che non ci siano altre operazioni in esecuzione sul server? –