Docs Menu
Docs Home
/ /

Buscar documentos

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

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.

Utilice operaciones de búsqueda para recuperar datos de MongoDB. Estas operaciones constan de los Find() FindOne() métodos y.

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 rating está entre 5 y 9 (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.

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", ... },
...

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_ordered es anterior al 30 ​​de noviembre de 2009

  • Omite 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.

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 ObjectId especificado

  • Proyectar solo los campos Item y Rating del 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.

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": [...]
}

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

SetCollation()

The type of language collation to use when sorting results.
Default: nil

SetLimit()

The maximum number of documents to return.
Default: 0
This option is not available for FindOneOptions. The FindOne() method internally uses SetLimit(-1).

SetProjection()

The fields to include in the returned documents.
Default: nil

SetSkip()

The number of documents to skip.
Default: 0

SetSort()

The field and type of sort to order the matched documents. You can specify an ascending or descending sort.
Default: none

Utilice operaciones de agregación para recuperar y transformar datos de MongoDB. Realice operaciones de agregación con el Aggregate() método.

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.

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

SetAllowDiskUse()

Whether to write to temporary files.
Default: false

SetBatchSize()

The number of documents to return in each batch.
Default: none

SetBypassDocumentValidation()

Whether to allow the write to opt-out of document level validation.
Default: false

SetCollation()

The type of language collation to use when sorting results.
Default: nil

SetMaxAwaitTime()

The maximum amount of time for the server to wait on new documents to satisfy a tailable cursor query.
Default: nil

SetComment()

An arbitrary string or document that allows you to trace the operation through the database profiler, currentOp, and logs.
Default: ""

SetHint()

The index to use to scan for documents to retrieve.
Default: nil

SetLet()

Specifies parameters for the aggregate expression, which improves command readability by separating the variables from the query text.
Default: none

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.

Para obtener más información sobre las operaciones mencionadas, consulte las siguientes guías:

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:

Volver

Especifica un query

En esta página