Página inicial do Docs → Desenvolver aplicações → MongoDB Drivers → Driver GO
Recuperar dados
Nesta página
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:
Recupere documentos de suas collections usando operações de localização
Realize transformações em documentos em suas collections usando operações de aggregation
Dados de amostra
Os exemplos nesta aba usam o seguinte struct Tea
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:
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
.
Para um exemplo que utiliza o método FindOne()
, consulte a seção Exemplo de localizar um nesta página. Para ver um exemplo que usa FindOne()
e faz queries usando um valor ObjectId
específico, consulte a seção Exemplo de localizar um por ObjectId nesta página.
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 |
---|---|
SetCollation() | O tipo de agrupamento de idiomas a ser usado ao classificar os resultados. Padrão: nil |
SetLimit() | O número máximo de documentos a retornar. Padrão: 0 ObservaçãoEsta opção não está disponível para |
SetProjection() | Os campos a incluir nos documentos devolvidos. Padrão: nil |
SetSkip() | O número de documentos a ignorar. Padrão: 0 |
SetSort() | O campo e o tipo de classificação para ordenar os documentos correspondentes. Você pode especificar uma classificação crescente ou decrescente. Padrão: nenhum |
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
rating
está entre5
e9
(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
ObjectId
especificadoProjete somente os campos
Item
eRating
do 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.
O método retorna os documentos resultantes em um tipo Cursor
. Se você omitir o estágio $match , o pipeline continuará usando todos os documentos da coleção.
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 |
---|---|
SetAllowDiskUse() | Se deve gravar em arquivos temporários. Padrão: false |
SetBatchSize() | O número de documentos a serem devolvidos em cada lote. Padrão: nenhum |
SetBypassDocumentValidation() | Se deve permitir que a gravação opte por não participar da validação em nível de documento. Padrão: false |
SetCollation() | O tipo de agrupamento de idiomas a ser usado ao classificar os resultados. Padrão: nil |
SetMaxTime() | A quantidade máxima de tempo que a consulta pode executar no servidor. Padrão: nil |
SetMaxAwaitTime() | O tempo máximo para o servidor aguardar novos documentos para atender a uma query de cursor adaptável. Padrão: nil |
SetComment() | Uma string arbitrária para ajudar a rastrear a operação através do perfil do banco de dados, currentOp e registros. Padrão: "" |
SetHint() | O índice a ser usado para digitalizar documentos a serem recuperados. Padrão: nil |
SetLet() | Especifica parâmetros para a expressão agregada, o que melhora a legibilidade do comando ao separar as variáveis do texto de query. Padrão: nenhum |
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"]) }
Para saber mais sobre como construir um pipeline de agregação, consulte a página manual do servidor MongoDB em Agregação.
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: