Overview
En esta guía, puedes aprender cómo especificar qué campos se deben devolver en un documento.
Datos de muestra
Los ejemplos en esta guía utilizan lo siguiente Course struct como modelo para documentos en la colección courses:
type Course struct { Title string `bson:"title,omitempty"` CourseId string `bson:"course_id,omitempty"` Enrollment int32 `bson:"enrollment,omitempty"` }
La omitempty struct etiqueta dirige al driver a excluir campos al deserializar según tu especificación de proyección.
Para ejecutar los ejemplos en esta guía, carga los datos de muestra en la colección db.courses con el siguiente fragmento:
coll := client.Database("db").Collection("courses") docs := []interface{}{ Course{Title: "Primate Behavior", CourseId: "PSY2030", Enrollment: 40}, Course{Title: "Revolution and Reform", CourseId: "HIST3080", Enrollment: 12}, } result, err := coll.InsertMany(context.TODO(), docs)
Tip
Bases de datos y colecciones inexistentes
Si la base de datos y la colección necesarias no existen cuando realizas una operación de guardar, el servidor las crea implícitamente.
Cada documento contiene una descripción de un curso universitario que incluye el título del curso, el ID del curso y el cupo máximo, correspondientes a los campos title, course_id y enrollment en cada documento.
Proyección
Una proyección especifica qué campos se deben devolver en los documentos coincidentes. El documento de proyección contiene nombres de campos con un 1 para incluir el campo correspondiente o 0 para excluirlo. Si estás utilizando un marco de agregación, también puedes especificar una proyección para incluir los campos recién calculados.
Se puede especificar una proyección pasando un documento de proyección al método SetProjection(). Las siguientes operaciones toman un objeto de opciones como parámetro:
Find()FindOne()FindOneAndDelete()FindOneAndReplace()FindOneAndUpdate()
Tip
Si no especificas una proyección, la operación devuelve todos los campos de los documentos coincidentes.
Excluir un campo
Para excluir un campo, pasa el campo que quieres excluir con un 0 al método SetProjection(). El driver incluye todos los campos que no se excluyen explícitamente en el documento de proyección, si se especifica algún campo para excluir.
Ejemplo
El siguiente ejemplo excluye los campos course_id y enrollment de los documentos que coinciden devueltos por el método Find():
filter := bson.D{} opts := options.Find().SetProjection(bson.D{{"course_id", 0}, {"enrollment", 0}}) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []Course if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"title":"Primate Behavior"} {"title":"Revolution and Reform"}
Incluir un campo
Para incluir un campo, pasa el campo que deseas incluir con un 1 al método SetProjection(). El driver excluye todos los campos que no estén explícitamente incluidos en el documento de proyección, si se especifican campos para incluir.
Ejemplo
El siguiente ejemplo incluye solo los campos title y enrollment de los documentos coincidentes devueltos por el método Find():
filter := bson.D{} opts := options.Find().SetProjection(bson.D{{"title", 1}, {"enrollment", 1}}) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []Course if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"title":"Primate Behavior","enrollment":40} {"title":"Revolution and Reform","enrollment":12}
Agregación
También puedes crear un $project etapa para especificar una proyección en una pipeline de agregación.
Ejemplo
El siguiente ejemplo incluye solo los campos title y course_id de los documentos coincidentes devueltos por el método Aggregate():
projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"course_id", 1}}}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{projectStage}) if err != nil { panic(err) } var results []Course if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"title":"Primate Behavior","course_id":"PSY2030"} {"title":"Revolution and Reform","course_id":"HIST3080"}
Información Adicional
Para aprender más sobre las operaciones mencionadas, consulte las siguientes guías:
Para aprender a proyectar puntuaciones de texto a partir de la búsqueda de texto, consulte Buscar texto.
Documentación de la API
Para obtener más información sobre cualquiera de los métodos o tipos discutidos en esta guía, consultar la siguiente documentación de la API: