findone - ¿Cómo consultar MongoDB para probar si existe un artículo?
mongodb is null (4)
¿MongoDB ofrece un método de búsqueda o consulta para probar si existe un artículo basado en cualquier valor de campo? Solo queremos verificar la existencia, no devolver el contenido completo del artículo.
Es significativamente más rápido usar find () + limit () porque findOne () siempre leerá + devolverá el documento si existe. find () simplemente devuelve un cursor (o no) y solo lee los datos si itera por el cursor.
db.collection.find({_id: "myId"}, {_id: 1}).limit(1)
(en lugar de db.collection.findOne({_id: "myId"}, {_id: 1})
).
Mire más detalles: verificando si existe un documento - MongoDB slow findOne vs find
Como no necesita el recuento, debe asegurarse de que la consulta regrese después de encontrar la primera coincidencia. Como el rendimiento del recuento 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()
de forma predeterminada no respeta la cláusula de limit
y, por lo tanto, puede devolver resultados inesperados (e intentará encontrar todas las coincidencias). size()
o count(true)
respetarán el indicador de límite.
Si desea ir al extremo, debe asegurarse de que su consulta utilice índices cubiertos . Los índices cubiertos solo tienen acceso al índice, pero requieren que el campo en el que realiza la 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()
, por lo tanto, si vale la pena o no, es difícil de decir. Como de costumbre, la medición es una mejor compañía que la teoría, pero la teoría al menos puede salvarlo de los problemas más grandes.
No creo que haya una manera directa de verificar la existencia del artículo por su valor. Pero puedes hacer eso simplemente recuperando solo el id ( con selección de campo )
db.your_collection.find({..criteria..}, {"_id" : 1});
Si usa Java y Spring, puede usar eso:
public interface UserRepository extends MongoRepository<User, ObjectId> {
boolean existsByUsername(String username);
}
Esto funciona para mi.