Dal momento che non hai bisogno del conteggio, dovresti assicurarti che la query ritorni dopo aver trovato la prima corrispondenza. Poiché le prestazioni di conteggio non sono l'ideale, è piuttosto importante. La seguente query dovrebbe farlo:
db.Collection.find({ /* criteria */}).limit(1).size();
Nota che find().count()
per impostazione predefinita non rispetta il limit
clausola e potrebbe quindi restituire risultati inaspettati (e proverà a trovare tutte le corrispondenze). size()
o count(true)
rispetterà il limite di bandiera.
Se vuoi andare agli estremi, dovresti assicurarti che la tua query utilizzi indici coperti. Gli indici coperti accedono solo all'indice, ma richiedono che il campo su cui esegui la query sia indicizzato. In generale, dovrebbe farlo perché count()
ovviamente non restituisce nessun campo. Tuttavia, gli indici coperti a volte necessitano di cursori piuttosto dettagliati:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Sfortunatamente, count()
non offre explain()
, quindi è difficile dire se ne valga la pena o meno. Come al solito, la misurazione è un compagno migliore della teoria, ma la teoria può almeno salvarti dai problemi più grandi.