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 Estructura como modelo para los documentos de 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 := []any{ 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 devolverán en los documentos coincidentes. El documento de proyección contiene nombres de campo con un 1 para incluir el campo correspondiente o un 0 para excluirlo. Si utiliza un marco de agregación, también puede especificar una proyección para incluir los campos recién calculados.
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, páselo con un 0 al método SetProjection(). El controlador incluye todos los campos que no están excluidos explícitamente en el documento de proyección, si especifica alguno 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 Etapa del proyecto para especificar una proyección en una canalización 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 sobre cómo proyectar puntuaciones de texto a partir de queries de texto, consulta Realizar una query de 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: