Explica find, findOne, filtros, proyecciones, ordenamiento, límites y cursores para recuperar documentos sin transferir ni examinar datos innecesarios.
Leer en MongoDB significa construir una query que seleccione documentos, decidir qué campos devolver, definir un orden y consumir los resultados sin utilizar más memoria, red o permisos de los necesarios.
findOne devuelve un documento o null. find devuelve un cursor que obtiene resultados por batches.
Texto
access pattern
↓
filter
↓
index / query plan
↓
projection + sort + limit
↓
cursor y batches
↓
DTO de respuesta
const order =await db.orders.findOne({_id: orderId,businessId: authenticatedBusinessId
});
La consulta incluye el tenant autorizado. Buscar solo por _id y autorizar después puede exponer diferencias entre “no existe” y “no pertenece”, además de facilitar errores en código.
findOne devuelve null cuando no existe coincidencia:
TypeScript
if(!order){thrownewError('Order not found');}
No utilices non-null assertions para esconder ese caso.
distinct puede ser útil para conjuntos pequeños de valores, pero resultados grandes consumen memoria y red. Para agrupación y métricas, aggregation suele ser más apropiada.
Por defecto, operaciones suelen leer del primary. Enviar lecturas a secondaries puede producir stale data.
Puede ser útil para analytics tolerante a retraso, pero no para una lectura crítica inmediatamente después de escribir sin diseñar consistencia causal o estrategia adecuada.
Una lectura segura y eficiente combina filter autorizado, projection mínima, orden estable, límite y consumo controlado del cursor. find no es una operación inocente: su coste depende del plan, volumen, consistency settings y forma de consumo.
Comprueba lo aprendido
¿Qué diferencia existe entre findOne y find?
¿Por qué projection no reemplaza un DTO?
¿Cuándo es seguro utilizar toArray()?
¿Qué problemas genera leer desde secondary inmediatamente después de escribir?
¿Por qué un total exacto puede ser más costoso que una página?