Overview
En esta guía, puede aprender cómo recuperar datos de sus colecciones de MongoDB mediante operaciones de lectura.
Las operaciones de lectura le permiten realizar lo siguiente:
Recupere documentos de sus colecciones mediante operaciones de búsqueda
Realice transformaciones en documentos de sus colecciones usando operaciones de agregación
Datos de muestra
Los ejemplos de esta guía utilizan lo siguiente: Tea Estructura como modelo para los documentos de la colección tea:
type Tea struct { Item string `bson:"item,omitempty"` Rating int32 `bson:"rating,omitempty"` DateOrdered time.Time `bson:"date_ordered,omitempty"` }
Para ejecutar los ejemplos de esta guía, cargue estos documentos en la colección tea de la base de datos db utilizando el siguiente fragmento:
coll := client.Database("db").Collection("tea") docs := []any{ Tea{Item: "Masala", Rating: 10, DateOrdered: time.Date(2009, 11, 17, 0, 0, 0, 0, time.Local)}, Tea{Item: "Sencha", Rating: 7, DateOrdered: time.Date(2009, 11, 18, 0, 0, 0, 0, time.Local)}, Tea{Item: "Masala", Rating: 9, DateOrdered: time.Date(2009, 11, 12, 0, 0, 0, 0, time.Local)}, Tea{Item: "Masala", Rating: 8, DateOrdered: time.Date(2009, 12, 1, 0, 0, 0, 0, time.Local)}, Tea{Item: "Sencha", Rating: 10, DateOrdered: time.Date(2009, 12, 17, 0, 0, 0, 0, time.Local)}, Tea{Item: "Hibiscus", Rating: 4, DateOrdered: time.Date(2009, 12, 18, 0, 0, 0, 0, time.Local)}, } 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 describe la variedad de té que pidió un cliente, su calificación y la fecha del pedido. Estas descripciones corresponden a los campos item, rating y date_ordered.
Operaciones de búsqueda
Utilice operaciones de búsqueda para recuperar datos de MongoDB. Estas operaciones constan de los Find() FindOne() métodos y.
Encuentra varios documentos
El Find() método espera que se pase un Context tipo y un filtro de consulta. El método devuelve todos los documentos que coinciden con el filtro como Cursor tipo.
El siguiente ejemplo pasa un contexto, un filtro y FindOptions al método Find(), que realiza las siguientes acciones:
Coincide con documentos donde el valor
ratingestá entre5y9(exclusivo)Ordena los documentos coincidentes en orden ascendente por
date_ordered
filter := bson.D{ {"$and", bson.A{ bson.D{{"rating", bson.D{{"$gt", 5}}}}, bson.D{{"rating", bson.D{{"$lt", 9}}}}, }}, } sort := bson.D{{"date_ordered", 1}} opts := options.Find().SetSort(sort) // Retrieves documents that match the filter and prints them as structs cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []Tea 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)) }
{"item":"Sencha","rating":7,"date_ordered":"2009-11-18T05:00:00Z"} {"item":"Masala","rating":8,"date_ordered":"2009-12-01T05:00:00Z"}
Para aprender a acceder a los datos mediante un cursor, consulte la Guíade acceso a datos desde un cursor.
Ejemplo de búsqueda de varios documentos: archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB mediante una URI de conexión. Para obtener más información sobre cómo conectarse a su instancia de MongoDB, consulte la guía "Crear un MongoClient". Este ejemplo también utiliza la restaurants colección de la sample_restaurants base de datos incluida en los conjuntos de datos de ejemplo de Atlas. Puede cargarlos en su base de datos en la versión gratuita de MongoDB Atlas siguiendo la Guía de introducción a Atlas.
El siguiente ejemplo busca todos los documentos de la colección restaurants cuyo valor de cuisine es "Italian". El ejemplo devuelve un cursor que referencia los documentos coincidentes y los descomprime en una porción:
// Retrieves documents that match a query filter by using the Go driver package main import ( "context" "encoding/json" "fmt" "log" "os" "github.com/joho/godotenv" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) // Creates a Restaurant struct as a model for documents in the restaurants collection type Restaurant struct { ID bson.ObjectID `bson:"_id"` Name string RestaurantId string `bson:"restaurant_id"` Cuisine string Address any Borough string Grades any } func main() { if err := godotenv.Load(); err != nil { log.Println("No .env file found") } var uri string if uri = os.Getenv("MONGODB_URI"); uri == "" { log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/es/docs/drivers/go/current/connect/mongoclient/#environment-variable") } client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { panic(err) } }() coll := client.Database("sample_restaurants").Collection("restaurants") // Creates a query filter to match documents in which the "cuisine" // is "Italian" filter := bson.D{{"cuisine", "Italian"}} // Retrieves documents that match the query filter cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } // Unpacks the cursor into a slice var results []Restaurant if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } // Prints the results of the find operation as structs for _, result := range results { output, err := json.MarshalIndent(result, "", " ") if err != nil { panic(err) } fmt.Printf("%s\n", output) } }
// results truncated ... { ... , "Name" : "Epistrophy Cafe", "RestaurantId": "41117553", "Cuisine" : "Italian", ... }, { ... , "Name" : "Remi", "RestaurantId": "41118090", "Cuisine" : "Italian", ... }, { ... , "Name" : "Sant Ambroeus", "RestaurantId": "41120682", "Cuisine" : "Italian", ... }, ...
Encuentre un documento
El FindOne() método espera que se pase un Context tipo y un filtro de consulta. El método devuelve el primer documento que coincide con el filtro como SingleResult tipo.
El siguiente ejemplo pasa un contexto, un filtro y FindOneOptions al método FindOne(), que realiza las siguientes acciones:
Coincide con los documentos donde el valor
date_orderedes anterior al 30 de noviembre de 2009Omite los dos primeros documentos coincidentes
filter := bson.D{{"date_ordered", bson.D{{"$lte", time.Date(2009, 11, 30, 0, 0, 0, 0, time.Local)}}}} opts := options.FindOne().SetSkip(2) // Retrieves a document that matches the filter and prints it as // a struct var result Tea err = coll.FindOne(context.TODO(), filter, opts).Decode(&result) if err != nil { if err == mongo.ErrNoDocuments { fmt.Println("No documents found") } else { panic(err) } } res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res))
{"item":"Masala","rating":9,"date_ordered":"2009-11-12T05:00:00Z"}
Para ver un ejemplo que utiliza FindOne() y realiza consultas utilizando un ObjectId valor específico, consulte la sección Ejemplo de búsqueda por ObjectId de esta página.
Para aprender cómo acceder a datos de un SingleResult tipo, consulte Desagrupación en la guía BSON.
Ejemplo de búsqueda de uno por ObjectId
Este ejemplo define una variable id con un valor de tipo ObjectId y utiliza id para especificar un filtro de consulta. El filtro busca un documento con un valor de campo _id correspondiente a la variable id. Este ejemplo consulta el siguiente documento basándose en su valor _id:
{ _id: ObjectId('65170b42b99efdd0b07d42de'), item: "Hibiscus", rating : 4, date_ordered : 2009-12-18T05:00:00.000+00:00 }
El siguiente código pasa el filtro y una instancia FindOneOptions como parámetros al método FindOne() para realizar las siguientes acciones:
Coincida el documento con el valor
ObjectIdespecificadoProyectar solo los campos
ItemyRatingdel documento coincidente
id, err := bson.ObjectIDFromHex("65170b42b99efdd0b07d42de") if err != nil { panic(err) } // Creates a filter to match a document that has the specified // "_id" value filter := bson.D{{"_id", id}} opts := options.FindOne().SetProjection(bson.D{{"item", 1}, {"rating", 1}}) // Retrieves a document that matches the filter and prints it as // a struct var result Tea err = coll.FindOne(context.TODO(), filter, opts).Decode(&result) if err != nil { if err == mongo.ErrNoDocuments { fmt.Println("No documents found") } else { panic(err) } } res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res))
{"item":"Hibiscus","rating":4}
Nota
El driver de Go genera automáticamente un valor único de ObjectId para el campo _id de cada documento, por lo que tu valor ObjectId podría diferir del ejemplo de código anterior. Para obtener más información sobre el campo _id, consulta la sección Campo _id de la página Insertar un documento.
Ejemplo de búsqueda de un documento: Archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB mediante una URI de conexión. Para obtener más información sobre cómo conectarse a su instancia de MongoDB, consulte la guía "Crear un MongoClient". Este ejemplo también utiliza la restaurants colección de la sample_restaurants base de datos incluida en los conjuntos de datos de ejemplo de Atlas. Puede cargarlos en su base de datos en la versión gratuita de MongoDB Atlas siguiendo la Guía de introducción a Atlas.
El siguiente ejemplo encuentra y devuelve el primer documento en la colección restaurants en el que el valor de name es "Bagels N Buns":
// Retrieves a document that matches a query filter by using the Go driver package main import ( "context" "encoding/json" "fmt" "log" "os" "github.com/joho/godotenv" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) // Creates a Restaurant struct as a model for documents in the restaurants collection type Restaurant struct { ID bson.ObjectID `bson:"_id"` Name string RestaurantId string `bson:"restaurant_id"` Cuisine string Address any Borough string Grades []any } func main() { if err := godotenv.Load(); err != nil { log.Println("No .env file found") } var uri string if uri = os.Getenv("MONGODB_URI"); uri == "" { log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/es/docs/drivers/go/current/connect/mongoclient/#environment-variable") } client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { panic(err) } }() coll := client.Database("sample_restaurants").Collection("restaurants") // Creates a query filter to match documents in which the "name" is // "Bagels N Buns" filter := bson.D{{"name", "Bagels N Buns"}} // Retrieves the first matching document var result Restaurant err = coll.FindOne(context.TODO(), filter).Decode(&result) // Prints a message if no documents are matched or if any // other errors occur during the operation if err != nil { if err == mongo.ErrNoDocuments { return } panic(err) } output, err := json.MarshalIndent(result, "", " ") if err != nil { panic(err) } fmt.Printf("%s\n", output) }
// results truncated { "ID": "5eb3d668b31de5d588f42950", "Name": "Bagels N Buns", "RestaurantId": "40363427" "Address": [...], "Borough": "Staten Island", "Cuisine": "Delicatessen", "Grades": [...] }
Modificar el comportamiento
Puede modificar el comportamiento de Find() y FindOne() pasando una instancia FindOptions o FindOneOptions. Si no especifica ninguna opción, el controlador usa los valores predeterminados para cada opción.
Puede configurar las opciones comúnmente utilizadas en ambos tipos con los siguientes métodos:
Método | Descripción |
|---|---|
| The type of language collation to use when sorting results. Default: nil |
| The maximum number of documents to return. Default: 0This option is not available for FindOneOptions. The
FindOne() method internally uses SetLimit(-1). |
| The fields to include in the returned documents. Default: nil |
| The number of documents to skip. Default: 0 |
| The field and type of sort to order the matched documents. You can specify an ascending or descending sort. Default: none |
Operaciones de agregación
Utilice operaciones de agregación para recuperar y transformar datos de MongoDB. Realice operaciones de agregación con el Aggregate() método.
Agregación
El Aggregate() método requiere que se pase un Context tipo y una canalización de agregación. Una canalización de agregación define cómo transformar los datos mediante etapas. Algunas de estas etapas son la comparación de documentos, el cambio de nombre de campos y la agrupación de valores.
El método devuelve los documentos resultantes en un Cursor tipo. Si se omite la etapa $match, la canalización continúa utilizando todos los documentos de la colección.
Para aprender cómo acceder a los datos en un cursor,consulte Acceder a los datos desde un cursor.
Modificar el comportamiento
El método Aggregate() puede tomar opcionalmente el tipo AggregateOptions, que representa las opciones que se pueden usar para modificar su comportamiento. Si no se especifica ninguna opción, el controlador utiliza los valores predeterminados para cada una.
El tipo AggregateOptions le permite configurar opciones con los siguientes métodos:
Método | Descripción |
|---|---|
| Whether to write to temporary files. Default: false |
| The number of documents to return in each batch. Default: none |
| Whether to allow the write to opt-out of document level validation. Default: false |
| The type of language collation to use when sorting results. Default: nil |
| The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query. Default: nil |
| An arbitrary string or document that allows you to trace the operation through the database profiler, currentOp, and logs. Default: "" |
| The index to use to scan for documents to retrieve. Default: nil |
| Specifies parameters for the aggregate expression, which improves command readability by separating the variables from the query text. Default: none |
Ejemplo
El siguiente ejemplo pasa un contexto y una canalización de agregación que realiza las siguientes acciones:
Reseñas de grupos por artículo pedido
Calcula la calificación promedio para cada artículo
groupStage := bson.D{ {"$group", bson.D{ {"_id", "$item"}, {"average", bson.D{ {"$avg", "$rating"}, }}, }}} cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{groupStage}) if err != nil { panic(err) } // Prints the average "rating" for each item var results []bson.M if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Printf("%v had an average rating of %v \n", result["_id"], result["average"]) }
Sencha had an average rating of 8.5 Hibiscus had an average rating of 4 Masala had an average rating of 9
Para obtener más información sobre cómo construir una canalización de agregación, consulte la página del manual del servidor MongoDB sobre agregación.
Información Adicional
Para obtener más información sobre las operaciones mencionadas, consulte las siguientes guías:
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: