Visão geral
Neste guia, você pode aprender como recuperar valores distintos para um campo especificado em uma única collection.
Dados de amostra
O exemplo neste guia utiliza o seguinte estrutura Course como um modelo para documentos na collection courses:
type Course struct { Title string Department string Enrollment int32}Para executar o exemplo, carregue os dados de amostra na coleção db.courses com o seguinte trecho:
coll := client.Database("db").Collection("courses")docs := []any{ Course{Title: "World Fiction", Department: "English", Enrollment: 35}, Course{Title: "Abstract Algebra", Department: "Mathematics", Enrollment: 60}, Course{Title: "Modern Poetry", Department: "English", Enrollment: 12}, Course{Title: "Plate Tectonics", Department: "Geology", Enrollment: 30},}
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 contém uma descrição de um curso universitário que inclui o nome do curso, o departamento e a inscrição. Estes itens correspondem aos campos title , department e enrollment em cada documento.
distinto
Para recuperar valores distintos para um campo especificado em uma única collection, passe os seguintes parâmetros para o método Distinct() :
O nome do campo para o qual você deseja recuperar os valores distintos
Um filtro de query
non-nilespecificando quais documentos devem ser correspondidos
Dica
Se você especificar um filtro de query vazio, o método Distinct() pesquisará valores distintos em todos os documentos de uma collection.
Modificar comportamento
Você pode modificar o comportamento do método Distinct() passando um DistinctOptions. Se você não especificar um DistinctOptions, o driver utilizará os valores padrão para cada opção.
O tipo DistinctOptions permite a você configurar opções com os seguintes métodos:
Método | Descrição |
|---|---|
| O tipo de agrupamento de idiomas a ser usado ao classificar os resultados. |
| Define um comentário a ser anexado à operação distinta. |
Exemplo
O exemplo a seguir corresponde a documentos com um valor de campo enrollment menor que 50 e imprime os valores distintos do campo department usando o método Distinct():
filter := bson.D{{"enrollment", bson.D{{"$lt", 50}}}}
var arr []stringerr = coll.Distinct(context.TODO(), "department", filter).Decode(&arr)if err != nil { panic(err)}
fmt.Printf("%s\n", arr)Exemplo de recuperação de valores distintos: arquivo completo
Observação
Exemplo de configuração
Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB, consulte Criar um MongoClient. Este exemplo também usa a coleção restaurants no banco de dados sample_restaurants incluído nos conjuntos de dados de amostra do Atlas. Você pode carregá-los em seu banco de dados em um cluster gratuito no MongoDB Atlas seguindo as etapas em Introdução ao Atlas.
Este exemplo executa as seguintes ações na coleção restaurant:
Corresponde a documentos em que o valor do campo
cuisineé"Tapas"Retorna valores distintos do campo
boroughdos documentos correspondentes
// Retrieves distinct values of a field by using the Go driverpackage main
import ( "context" "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")
type Restaurant struct { ID bson.ObjectID `bson:"_id"` Name string RestaurantId string `bson:"restaurant_id"` Cuisine string Address interface{} Borough string Grades interface{}}
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/pt-br/docs/drivers/go/current/usage-examples/#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) } }()
// Filters the collection for documents where the value of cuisine is "Tapas" coll := client.Database("sample_restaurants").Collection("restaurants") filter := bson.D{{"cuisine", "Tapas"}}
// Retrieves the distinct values of the "borough" field in documents // that match the filter var arr []string err = coll.Distinct(context.TODO(), "borough", filter).Decode(&arr) if err != nil { panic(err) }
// Prints the distinct "borough" values for _, result := range arr { fmt.Println(result) }
// When you run this file, it should print: // Brooklyn // Manhattan // Queens}Informações adicionais
Para saber mais sobre a construção de um filtro de query, consulte Especificar uma query.
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: