Una query normal de Mongoose convierte cada resultado en un con métodos, getters, virtuals, change tracking y metadata interna. evita esa hidratación y devuelve objetos JavaScript simples.
documento hidratado
lean()
Texto
MongoDB result
→ hydration
→ Mongoose Document
MongoDB result
→ lean
→ plain object
La mejora ocurre principalmente en CPU y memoria de Node.js. El plan de MongoDB, los índices y la cantidad de documentos examinados no cambian por usar lean.
Con una query lean, fullName normalmente no existe salvo opciones o plugins compatibles. Para contratos públicos importantes, calcula el DTO explícitamente en lugar de depender de magia de hydration.
Los documentos poblados también suelen ser lean. Esto reduce memoria, pero getters, virtuals y methods de los Models relacionados tampoco estarán disponibles.
Hydration puede hacer que ciertos defaults parezcan presentes aunque el documento almacenado no los tenga. Lean revela más directamente lo persistido.
Esto es útil para detectar schema drift, pero puede romper código que asumía defaults. La solución correcta es lectura tolerante o migración, no quitar lean sin analizar.
Lean sigue devolviendo tipos BSON como ObjectId, Decimal128 y Date. No significa que el objeto esté listo para API pública. Usa mapper y no expongas campos internos.
Query middleware sí puede ejecutarse antes de obtener resultados; document middleware y métodos de documento no aplican. Un endpoint puede seguir teniendo efectos implícitos por query hooks aunque utilice lean.
lean() elimina hidratación y reduce trabajo en Node.js, no en MongoDB. Es ideal para lecturas que solo proyectan y serializan. Debes aceptar la pérdida de methods, getters y virtuals, modelar tipos separados y seguir usando projections, autorización y DTOs.