Al fin luego de tanto luchar hemos encontrado la respuesta de este dilema que algunos lectores de nuestro sitio web presentan. Si tienes alguna información que aportar puedes aportar tu información.
Solución:
Dado que no necesita el conteo, debe asegurarse de que la consulta regrese después de encontrar la primera coincidencia. Dado que el rendimiento de conteo no es ideal, eso es bastante importante. La siguiente consulta debería lograr eso:
db.Collection.find( /* criteria */).limit(1).size();
Tenga en cuenta que find().count()
por defecto lo hace no honrar el limit
cláusula y, por lo tanto, podría devolver resultados inesperados (e intentará encontrar todas las coincidencias). size()
o count(true)
respetará la bandera de límite.
Si quiere ir a los extremos, debe asegurarse de que su consulta use índices cubiertos. Los índices cubiertos solo acceden al índice, pero requieren que el campo que consulta esté indexado. En general, eso debería hacerlo porque un count()
obviamente no devuelve ningún campo. Aún así, los índices cubiertos a veces necesitan cursores bastante detallados:
db.values.find("value" : 3553, "_id": 0, "value" : 1).limit(1).explain();
// ...
"cursor" : "BtreeCursor value_1",
"indexOnly" : true, // covered!
Desafortunadamente, count()
no ofrece explain()
, así que si vale la pena o no es difícil de decir. Como de costumbre, la medición es un mejor compañero que la teoría, pero la teoría al menos puede salvarlo de los problemas más grandes.
No creo que haya una forma directa de verificar la existencia del artículo por su valor. Pero podría hacerlo simplemente recuperando solo la identificación (con selección de campo)
db.your_collection.find(..criteria.., "_id" : 1);
A partir de Mongo 2.6
, count
tiene un limit
parámetro opcional, lo que lo convierte en una alternativa viable para saber si un documento existe o no:
db.collection.count(, limit: 1 )
// returns 1 if exists and 0 otherwise
o con una consulta de filtrado:
db.collection.count(/* criteria */, limit: 1 )
Limitar el número de coincidencias hace que el análisis de la colección se detenga cada vez que se encuentra una coincidencia en lugar de revisar toda la colección.
A partir de Mongo 4.0.3
ya que count()
se considera obsoleto podemos usar countDocuments
en lugar de:
db.collection.countDocuments(, limit: 1 )
o con una consulta de filtrado:
db.collection.countDocuments(/* criteria */, limit: 1 )
Comentarios y puntuaciones
Recuerda dar recomendación a esta crónica si lograste el éxito.