Da Sie die Anzahl nicht benötigen, sollten Sie sicherstellen, dass die Abfrage zurückkehrt, nachdem sie die erste Übereinstimmung gefunden hat. Da die Zählleistung nicht ideal ist, ist das ziemlich wichtig. Die folgende Abfrage sollte dies bewerkstelligen:
db.Collection.find({ /* criteria */}).limit(1).size();
Beachten Sie, dass find().count()
standardmäßig nicht das limit
einhalten -Klausel und kann daher unerwartete Ergebnisse zurückgeben (und wird versuchen, alle Übereinstimmungen zu finden). size()
oder count(true)
wird das Limit-Flag respektieren.
Wenn Sie ins Extreme gehen wollen, sollten Sie darauf achten, dass Ihre Abfrage abgedeckte Indizes verwendet. Überdeckte Indizes greifen nur auf den Index zu, erfordern jedoch, dass das Feld, das Sie abfragen, indiziert ist. Im Allgemeinen sollte das tun, weil ein count()
gibt offensichtlich keine Felder zurück. Dennoch benötigen abgedeckte Indizes manchmal ziemlich ausführliche Cursor:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Leider count()
bietet explain()
nicht an , also ob es sich lohnt oder nicht ist schwer zu sagen. Wie üblich ist die Messung ein besserer Begleiter als die Theorie, aber die Theorie kann Sie zumindest vor den größeren Problemen bewahren.