Overview
En esta guía, puede aprender a especificar qué campos devolver en un documento.
Datos de muestra
Los ejemplos de 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"` }
El omitempty La etiqueta struct le indica al controlador que excluya campos al desagrupar según su especificación de proyección.
Para ejecutar los ejemplos de esta guía, cargue 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 realiza una operación de escritura, 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 la inscripción máxima, 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 especifica 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 coincidentes 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, páselo con un 1 al método SetProjection(). El controlador excluye todos los campos que no estén incluidos explícitamente en el documento de proyección si especifica alguno 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 obtener más información sobre las operaciones mencionadas, consulte las siguientes guías:
Para obtener más información sobre cómo proyectar puntuaciones de texto a partir de sus consultas de texto, consulte Realizar una consulta 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: