Controla qué campos devuelve una consulta mediante proyecciones de inclusión, exclusión y rutas anidadas para reducir transferencia y exposición de datos.
La define qué campos devuelve MongoDB después de encontrar un documento. No cambia qué documentos coinciden; cambia la forma y cantidad de información que sale del servidor.
La proyección es parte del access pattern porque afecta payload, serialización, exposición de datos y, en algunos casos, la posibilidad de resolver una query únicamente desde un índice.
Por regla general no se mezclan inclusión y exclusión en la misma proyección, excepto el tratamiento especial de _id.
Para APIs públicas suele ser más seguro incluir explícitamente campos permitidos que excluir una lista de secretos. Si mañana aparece un nuevo campo sensible, una allowlist de inclusión no lo expone accidentalmente.
Puede utilizarse para limitar un subset embebido, pero no corrige un array ilimitado. El documento completo sigue creciendo y el índice multikey mantiene su coste.
Puede proyectar el primer elemento que cumple una condición:
JavaScript
{items:{$elemMatch:{
productId
}}}
Esto no equivale a filtrar todos los elementos coincidentes. Si necesitas transformar o conservar múltiples elementos, aggregation con $filter puede ser más apropiada.
En contextos compatibles, devuelve el primer elemento que coincide con la condición de query. Su semántica depende del filtro y puede ser difícil de mantener. Para respuestas complejas, una pipeline suele resultar más explícita.
Una proyección pequeña reduce red y serialización. Sin embargo, si el plan necesita leer el documento para comprobar filtros o recuperar un campo no indexado, seguirá existiendo FETCH.
explain('executionStats') ayuda a verificar:
si existe FETCH;
keys examinadas;
documentos examinados;
documentos devueltos;
sort adicional;
plan ganador.
No deduzcas cobertura solo porque la proyección parece pequeña.
Projection es una herramienta de consulta y rendimiento, no un contrato público completo. Reduce campos, red y exposición, y puede permitir covered queries. Debe diseñarse junto con filtros, índices, DTOs y autorización.
Comprueba lo aprendido
¿Qué diferencia existe entre inclusión y exclusión?
¿Por qué _id tiene tratamiento especial?
¿Qué condiciones hacen que una query sea covered?
¿Por qué projection no reemplaza autorización ni DTOs?
¿Qué riesgo tiene permitir campos dinámicos enviados por el cliente?