Eftersom du inte behöver räkningen bör du se till att frågan kommer tillbaka efter att den hittat den första matchningen. Eftersom räkningsprestanda inte är idealiskt, är det ganska viktigt. Följande fråga bör åstadkomma det:
db.Collection.find({ /* criteria */}).limit(1).size();
Observera att find().count()
som standard inte respektera limit
klausul och kan därför ge oväntade resultat (och kommer att försöka hitta alla matchningar). size()
eller count(true)
kommer att hedra gränsflaggan.
Om du vill gå till ytterligheter bör du se till att din fråga använder täckta index. Täckta index får bara tillgång till indexet, men de kräver att fältet du frågar i är indexerat. I allmänhet borde det göra det eftersom en count()
returnerar uppenbarligen inga fält. Ändå behöver täckta index ibland ganska utförliga markörer:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Tyvärr, count()
erbjuder inte explain()
, så om det är värt det eller inte är svårt att säga. Som vanligt är mätning en bättre följeslagare än teori, men teori kan åtminstone rädda dig från de större problemen.