Aangezien u de telling niet nodig hebt, moet u ervoor zorgen dat de zoekopdracht wordt geretourneerd nadat de eerste overeenkomst is gevonden. Aangezien de telprestaties niet ideaal zijn, is dat nogal belangrijk. De volgende query zou dat moeten bereiken:
db.Collection.find({ /* criteria */}).limit(1).size();
Merk op dat find().count()
standaard doet niet respecteer de limit
clausule en kan daarom onverwachte resultaten opleveren (en zal proberen alle overeenkomsten te vinden). size()
of count(true)
zal de limietvlag respecteren.
Als u tot het uiterste wilt gaan, moet u ervoor zorgen dat uw zoekopdracht gedekte indexen gebruikt. Gedekte indexen hebben alleen toegang tot de index, maar ze vereisen dat het veld waarop u zoekt, is geïndexeerd. Over het algemeen zou dat het moeten doen omdat een count()
retourneert uiteraard geen velden. Toch hebben gedekte indexen soms nogal uitgebreide cursors nodig:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Helaas, count()
biedt geen explain()
, dus of het het waard is of niet is moeilijk te zeggen. Zoals gewoonlijk is meten een betere partner dan theorie, maar theorie kan je in ieder geval redden van de grotere problemen.