Ponieważ nie potrzebujesz licznika, upewnij się, że zapytanie powróci po znalezieniu pierwszego dopasowania. Ponieważ wydajność liczenia nie jest idealna, jest to dość ważne. Powinno to zapewnić następujące zapytanie:
db.Collection.find({ /* criteria */}).limit(1).size();
Zauważ, że find().count()
domyślnie nie przestrzegaj limit
klauzuli i może w związku z tym zwrócić nieoczekiwane wyniki (i spróbuje znaleźć wszystkie dopasowania). size()
lub count(true)
będzie honorować flagę limitu.
Jeśli chcesz posunąć się do skrajności, upewnij się, że Twoje zapytanie używa ukrytych indeksów. Objęte indeksy uzyskują dostęp tylko do indeksu, ale wymagają indeksowania pola, którego dotyczy zapytanie. Ogólnie powinno to wystarczyć, ponieważ count()
oczywiście nie zwraca żadnych pól. Mimo to, pokryte indeksy czasami potrzebują raczej gadatliwych kursorów:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Niestety, count()
nie oferuje explain()
, więc trudno powiedzieć, czy warto, czy nie. Jak zwykle pomiary są lepszym towarzyszem niż teoria, ale teoria może przynajmniej uchronić Cię przed większymi problemami.