Так как вам не нужен счетчик, вы должны убедиться, что запрос вернется после того, как будет найдено первое совпадение.Поскольку производительность count не идеальна , это довольно важно.Следующий запрос должен выполнить это:
db.Collection.find({ /* criteria */}).limit(1).size();
Обратите внимание, что find().count()
по умолчанию не удовлетворяет предложению limit
и, следовательно, может вернуть неожиданные результаты (и попытается найти всеМатчи).size()
или count(true)
соблюдает флаг ограничения.
Если вы хотите достичь крайностей, вам следует убедиться, что в вашем запросе используются закрытые индексы .Покрываемые индексы имеют доступ только к индексу, но они требуют, чтобы поле, к которому вы запрашиваете, было проиндексировано.В общем, это должно быть сделано, потому что count()
явно не возвращает никаких полей.Тем не менее, для покрытых индексов иногда нужны довольно подробные курсоры:
db.values.find({"value" : 3553}, {"_id": 0, "value" : 1}).limit(1).explain();
{
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
}
К сожалению, count()
не предлагает explain()
, поэтому трудно сказать, стоит ли это того или нет.Как обычно, измерение - лучший компаньон, чем теория, но теория может, по крайней мере, избавить вас от более серьезных проблем.