Jesus Rodriguez
Dentro Project también se puede colocar true o false en vez de 1 y 0.
db.trips.find( {}, { _id: false, tripduration: true } )
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
1cuáles incluir y con0cuá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.
1 para incluir un campo en la respuesta.0 para excluir un campo cuando estás en modo exclusión.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 con1, el resto ya está excluido. Solo_idadmite el0explí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.
Jesus Rodriguez
Dentro Project también se puede colocar true o false en vez de 1 y 0.
db.trips.find( {}, { _id: false, tripduration: true } )
Italo Enrique Beltrán Hervias
Otra forma de utilizar el projection de manera explicita.
use("sample_training") //Aqui aplicamos projection de forma explicita db.trips.find({tripduration:{$lte:500},usertype:"Subscriber"}).projection({"tripduration":1,"end station name":1}) //Aqui ademas agregue un sort que seria como un Order By db.trips.find({tripduration:{$lte:500},usertype:"Subscriber"}).projection({"tripduration":1,"end station name":1}).sort({tripduration:1})
Àlex Grau Roca
Lo mismo aplica a la inversa, por si quieres devolver todo excepto X campos concretos, en el projection se especifican los campos que no queremos con el valor 0
Ronaldo Jiménez
db.teams.find({}, {name: 1, _id: 0}).sort({country: -1}); ``````c# // lo mismo que si trabajamos con SQL SELECT name FROM teams ORDER BY country DESC;
Federico Bisignano
use ("sample_training") //Projection de forma implicita db.trips.find ({ //Query tripduration: { $gte: 500 }}, //gte + todo los valores >= 500 segundos //projection { tripduration: 1, usertype: 1} ) //Poner el 1 cuando quiero que solo muestre esos campos en especifico // el _id es el unico que se muestra siempre, sino lo queremos debemos ocultarlo explicitamente // el 0 se usa para desactivar campos exolicitamente
Roberto Shirásago Domínguez
Chulada de clase, ya puedo hacer varias cosas que hago en sql
use("sample_training") // Sirven para traer ciertos campos y no todos los que tiene el documento db.trips.find( //where {"bikeid": { $in: [23933, 14562] } }, //projection { "_id": 0, // Este campo no se va a mostrar (por el 0) "start station name": 1, // Este campo si se va a mostrar (por el 1) "end station name": 1, "bikeid": 1 } )
Luis Santiago Cortés Hernández
Diego Jurado
Gracias por compartir la comparativa
Comparto las dos formas que me funcionaron project
Primera forma
use("Platzi_store") // busqueda entre un array que inicie la palabra "S" // la letra "i" ignore si es mayuscula o minuscula // La "m" ayuda a ignorar los saltos de linea en una variable db.inventory.find({ "item.description": { $regex: /^S/im } }, // este filtro ayuda solo a mostrar los campos que se quieren visualizar { _id: false, item: true })
Segunda forma
use("Platzi_store") // busqueda entre un array que inicie la palabra "S" // la letra "i" ignore si es mayuscula o minuscula // La "m" ayuda a ignorar los saltos de linea en una variable db.inventory.find({ "item.description": { $regex: /^S/im } }// este filtro ayuda solo a mostrar los campos que se quieren visualizar ).projection({ _id: false, item: true })