Como você não precisa da contagem, verifique se a consulta retornará depois de encontrar a primeira correspondência. Como o desempenho da contagem não é ideal, isso é bastante importante. A consulta a seguir deve fazer isso:
db.Collection.find({ /* criteria */}).limit(1).size();
Observe que
find().count()
por padrão não respeitar o limit
cláusula e, portanto, pode retornar resultados inesperados (e tentará encontrar todas as correspondências). size()
ou count(true)
honrará a bandeira de limite. Se você quiser ir ao extremo, certifique-se de que sua consulta use índices cobertos. Os índices cobertos acessam apenas o índice, mas exigem que o campo que você consulta seja indexado. Em geral, isso deve funcionar porque um
count()
obviamente não retorna nenhum campo. Ainda assim, os índices cobertos às vezes precisam de cursores bastante detalhados:db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Infelizmente,
count()
não oferece explain()
, então se vale a pena ou não é difícil dizer. Como de costume, a medição é uma companhia melhor do que a teoria, mas a teoria pode pelo menos salvá-lo dos problemas maiores.