Comme vous n'avez pas besoin du nombre, vous devez vous assurer que la requête reviendra après avoir trouvé la première correspondance. Étant donné que les performances de comptage ne sont pas idéales, c'est plutôt important. La requête suivante devrait accomplir cela :
db.Collection.find({ /* criteria */}).limit(1).size();
Notez que find().count()
par défaut pas respecter la limit
clause et peut donc renvoyer des résultats inattendus (et essaiera de trouver toutes les correspondances). size()
ou count(true)
respectera l'indicateur de limite.
Si vous voulez aller à l'extrême, vous devez vous assurer que votre requête utilise des index couverts. Les index couverts n'accèdent qu'à l'index, mais ils nécessitent que le champ sur lequel vous interrogez soit indexé. En général, cela devrait le faire car un count()
ne renvoie évidemment aucun champ. Pourtant, les index couverts nécessitent parfois des curseurs plutôt verbeux :
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
Malheureusement, count()
n'offre pas explain()
, il est donc difficile de dire si cela en vaut la peine ou non. Comme d'habitude, la mesure est un meilleur compagnon que la théorie, mais la théorie peut au moins vous éviter les problèmes les plus importants.