Da du ikke har brug for optællingen, bør du sørge for, at forespørgslen vender tilbage, efter at den har fundet det første match. Da tælleydelse ikke er ideel, er det ret vigtigt. Følgende forespørgsel skulle opnå dette:
db.Collection.find({ /* criteria */}).limit(1).size();
Bemærk, at find().count()
som standard ikke overhold limit
klausul og kan derfor returnere uventede resultater (og vil forsøge at finde alle matches). size()
eller count(true)
vil respektere grænseflaget.
Hvis du vil gå til ekstremer, bør du sørge for, at din forespørgsel bruger dækkede indekser. Dækkede indekser har kun adgang til indekset, men de kræver, at det felt, du forespørger på, er indekseret. Generelt burde det gøre det, fordi en count()
returnerer naturligvis ingen felter. Alligevel har dækkede indekser nogle gange brug for temmelig omfattende markører:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Desværre, count()
tilbyder ikke explain()
, så om det er det værd eller ej er svært at sige. Som sædvanlig er måling en bedre følgesvend end teori, men teori kan i det mindste redde dig fra de større problemer.