Cuando consultas datos en MongoDB, muchas veces no necesitas todos los campos de un documento, solo unos pocos. Ahí entra projection en MongoDB, la función que te permite seleccionar qué atributos devolver en una consulta y dejar fuera el resto. Es una herramienta clave para optimizar queries y trabajar con datos más limpios.
¿Qué es projection en MongoDB y para qué sirve?
Projection es la forma en que indicas a MongoDB qué campos quieres recibir como respuesta de un find. Por defecto, una consulta te trae todos los atributos de los documentos que cumplen el filtro, pero con projection eliges solo los que te interesan.
Esto resulta útil cuando trabajas con análisis de datos o cuando solo necesitas un par de campos específicos para una operación mayor. En lugar de cargar documentos completos, traes lo justo y necesario.
¿Qué hace projection en una consulta de MongoDB? Filtra los campos que devuelve el query. Le dices con 1 cuáles incluir y con 0 cuáles excluir, así obtienes solo la información relevante.
¿Cómo usar projection desde Mongo Compass?
Dentro de Mongo Compass, al abrir el panel de options en una consulta encuentras el campo project [01:00]. Ahí defines un objeto donde cada llave es un atributo del documento y el valor indica si quieres mostrarlo o no.
Por ejemplo, si en la colección de viajes solo te interesa el nombre de la estación de inicio, escribes:
{ "startStationName": 1 }
Al ejecutar el find, la respuesta solo incluye ese campo y el _id. Si quieres sumar más atributos, como startLocation y endLocation, los activas también con 1. Así combinas un filtro (viajes menores a 200 segundos con userType igual a subscriber) con una proyección que te devuelve únicamente los datos que necesitas.
¿Por qué siempre aparece el campo _id?
El _id es el único campo que MongoDB incluye por defecto en toda respuesta. Si no lo quieres ver, debes excluirlo explícitamente con 0:
{ "startStationName": 1, "_id": 0 }
Este comportamiento es particular del _id. El resto de los campos se excluyen de manera implícita al activar otros con 1.
¿Cuándo usar 1 y cuándo usar 0 en projection?
La lógica es directa pero tiene una trampa que puede generar errores si la mezclas mal.
- Usa
1 para incluir un campo en la respuesta.
- Usa
0 para excluir un campo cuando estás en modo exclusión.
- No mezcles
1 y 0 en la misma proyección, salvo con _id.
Si ya activaste ciertos campos con 1, los demás quedan ocultos automáticamente. Intentar excluir uno de esos con 0 lanza un error, porque MongoDB interpreta que estás contradiciendo la regla. Por ejemplo, si pides startStationName: 1 y luego escribes userType: 0, el motor responderá con error [03:30].
¿Puedo mezclar inclusión y exclusión en projection? No, excepto para _id. Si activas campos con 1, el resto ya está excluido. Solo _id admite el 0 explícito junto a inclusiones.
¿Cómo aplicar projection desde el código?
Desde un archivo .mongodb conectado a una base como sample_training, el método find acepta dos parámetros: la query y la projection.
javascript
db.trips.find(
{ tripduration: { $gte: 500 } },
{ tripduration: 1, usertype: 1 }
)
El primer objeto define el filtro, en este caso viajes con duración mayor o igual a 500 segundos [05:00]. El segundo objeto define los campos a devolver: tripduration y usertype. El resultado trae solo esos atributos junto con el _id, que como ya viste viene siempre a menos que lo desactives.
Esta sintaxis te da control fino sobre lo que cargas en memoria, algo muy valioso cuando trabajas con colecciones grandes o pipelines de análisis.
¿Qué pasa si dejo la query vacía?
Un find({}, { campo: 1 }) te devuelve todos los documentos de la colección, pero solo con los campos que indicaste en la projection. Es útil cuando quieres explorar atributos específicos sin filtrar por condiciones.
Dominar projection te prepara para el siguiente paso: trabajar con operadores de consulta cuando los documentos contienen arrays. ¿Has tenido errores al combinar inclusiones y exclusiones? Cuéntalo en los comentarios.