Visão geral
Neste guia, você pode aprender como recuperar dados de suas coleções MongoDB usando operações de leitura.
As operações de leitura permitem que fazer o seguinte:
Retrieve documents from your collections by using find operations
Perform transformations on documents in your collections by using aggregation operations
Dados de amostra
Os exemplos deste guia utilizam o seguinte Tea estruturado como um modelo para documentos na coleção tea:
type Tea struct { Item string `bson:"item,omitempty"` Rating int32 `bson:"rating,omitempty"` DateOrdered time.Time `bson:"date_ordered,omitempty"` }
Para executar os exemplos neste guia, carregue estes documentos na coleção tea no banco de dados do db utilizando o seguinte trecho de código:
coll := client.Database("db").Collection("tea") docs := []interface{}{ 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)
Dica
Bancos de Dados e Coleções Inexistentes
Se o banco de dados e a collection necessários não existirem quando você executar uma operação de escrita, o servidor implicitamente os criará.
Cada documento descreve a variedade de chá que um cliente pediu, sua classificação e a data do pedido. Estas descrições correspondem aos campos item, rating e date_ordered.
Encontrar operações
Use localizar operações para recuperar dados do MongoDB. As operações de localização consistem nos métodos Find() e FindOne().
Localizar todos os documentos
O método Find() espera que você passe um tipo Context e um filtro de query. O método retorna todos os documentos que correspondem ao filtro como um tipo Cursor.
Para um exemplo que utiliza o método Find(), consulte a seção Encontrar Exemplo desta página. Para saber como acessar dados usando um cursor, consulte o guia Acessar dados de um cursor.
Encontrar um documento
O método FindOne() espera que você passe um tipo de Context e um filtro de query. O método retorna o primeiro documento que corresponde ao filtro como um tipo SingleResult.
For an example that uses the FindOne() method, see the Find One Example section of this page. For an example that uses FindOne() and queries by using a specific ObjectId value, see the Find One by ObjectId Example section of this page.
Para saber como acessar dados de um tipo SingleResult, consulte Unmarshalling no guia BSON.
Modificar comportamento
Você pode modificar o comportamento de Find() e FindOne() passando os tipos FindOptions e FindOneOptions, respectivamente. Se você não especificar nenhuma opção, o driver usará os valores padrão para cada opção.
Você pode configurar as opções normalmente usadas em ambos os tipos com os seguintes métodos:
Método | Descrição |
|---|---|
| O tipo de agrupamento de idiomas a ser usado ao classificar os resultados. |
| O número máximo de documentos a retornar. |
| Os campos a incluir nos documentos devolvidos. |
| O número de documentos a ignorar. |
| O campo e o tipo de classificação para ordenar os documentos correspondentes. Você pode especificar uma classificação crescente ou decrescente. |
Exemplo de localização
O exemplo seguinte passa um contexto, filtro e FindOptions para o método Find(), que executa as seguintes ações:
Corresponde aos documentos onde o valor de
ratingestá entre5e9(exclusivo)Classifica os documentos correspondentes em ordem crescente 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)) }
Encontrar um exemplo
O exemplo seguinte passa um contexto, filtro e FindOneOptions para o método FindOne(), que executa as seguintes ações:
Corresponde a documentos onde o valor
date_orderedé igual ou anterior a 30 de novembro de 2009Ignora os dois primeiros documentos correspondentes
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))
Encontre um por exemplo de ObjectId
Este exemplo define uma variável id com um valor do tipo ObjectId e utiliza id para especificar um filtro de query. O filtro corresponde a um documento com um valor de campo _id que corresponde à variável id. Este exemplo query o seguinte documento com base em seu valor _id:
{ _id: ObjectId('65170b42b99efdd0b07d42de'), item: "Hibiscus", rating : 4, date_ordered : 2009-12-18T05:00:00.000+00:00 }
O código abaixo passa o filtro e uma instância do FindOneOptions como parâmetros para o método do FindOne() para executar as seguintes ações:
Combine o documento com o valor de
ObjectIdespecificadoProjete somente os campos
ItemeRatingdo documento correspondente
id, err := primitive.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))
Observação
O driver Go gera automaticamente um valor ObjectId exclusivo para cada campo _id do documento, portanto, seu valor ObjectId pode ser diferente do exemplo de código anterior. Para obter mais informações sobre o campo _id, consulte a seção _id Field da página Inserir um documento.
Operações de agregação
Use operações de aggregation para recuperar e transformar dados do MongoDB. Execute operações de aggregation usando o método Aggregate().
Agregação
O método Aggregate() espera que você passe um tipo Context e um pipeline de agregação. Um pipeline de agregação define como transformar dados por meio de estágios. Algumas das etapas são combinar documentos, renomear campos e agrupar valores.
The method returns the resulting documents in a Cursor type. If you omit the $match stage, the pipeline proceeds using all documents in the collection.
Para saber como acessar dados em um cursor, consulte Como acessar dados de um cursor.
Modificar comportamento
O método Aggregate() opcionalmente usa um tipo AggregateOptions , que representa opções que você pode usar para modificar seu comportamento. Se você não especificar nenhuma opção, o driver usará os valores padrão para cada opção.
O tipo AggregateOptions permite a você configurar opções com os seguintes métodos:
Método | Descrição |
|---|---|
| Se deve gravar em arquivos temporários. |
| O número de documentos a serem devolvidos em cada lote. |
| Se deve permitir que a gravação opte por não participar da validação em nÃvel de documento. |
| O tipo de agrupamento de idiomas a ser usado ao classificar os resultados. |
| A quantidade máxima de tempo que a query pode executar no servidor. |
| O tempo máximo para o servidor aguardar novos documentos para atender a uma query de cursor persistente. |
| Uma string arbitrária para ajudar a rastrear a operação através do profiler de banco de dados, currentOp e logs. |
| O Ãndice a ser usado para digitalizar documentos a serem recuperados. |
| Especifica parâmetros para a expressão agregada, o que melhora a legibilidade do comando ao separar as variáveis do texto de query. |
Exemplo
O exemplo abaixo passa um contexto e uma aggregation pipeline que executa as seguintes ações:
Agrupa avaliações por item pedido
Calcula a classificação média para cada item
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"]) }
To learn more about how to construct an aggregation pipeline, see the MongoDB server manual page on Aggregation.
Informações adicionais
Para obter exemplos executáveis das operações de localização, consulte os seguintes exemplos de uso:
Para saber mais sobre as operações mencionadas, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: