Visão geral
Neste guia, você aprenderá como se conectar a uma instância do MongoDB ou a uma implantação de conjunto de réplicas usando o driver Go.
Você pode usar o driver Go para se conectar a implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço fully managed para implantações do MongoDB na cloud
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
URI de conexão
Um URI de conexão, também conhecido como cadeia de conexão, informa ao driver como se conectar ao MongoDB e como se comportar enquanto estiver conectado.
Partes de um URI de conexão
O exemplo a seguir explica cada parte de um exemplo de URI de conexão:

Neste exemplo, usamos mongodb
para o protocolo, que especifica o formato de cadeias de conexão padrão. Você também pode usar o formato de conexão de seed list de DNS caso deseje mais flexibilidade de implantação e a capacidade de alterar os servidores em rotação sem reconfigurar os clientes.
A próxima parte da cadeia de conexão contém seu nome de usuário e, se você estiver usando autenticação por senha, a própria senha. Substitua o valor de user
pelo seu nome de usuário e pass
pela sua senha. Se você estiver usando um mecanismo de autenticação que não requer um nome de usuário e senha, omita esta parte do URI de conexão.
A próxima parte da cadeia de conexão especifica o nome do host ou o endereço IP e a porta da instância do MongoDB. No exemplo anterior, usamos sample.host
como nome de host e 27017
como porta. Substitua esses valores para apontar para a sua instância MongoDB.
A última parte da cadeia de conexão especifica as opções de conexão e autenticação. No exemplo, definimos duas opções de conexão: maxPoolSize=20
e w=majority
. Para saber mais sobre as opções de conexão, leia a seção Opções de conexão deste guia.
Exemplo de conexão
Para se conectar ao MongoDB, você deve criar um cliente. Um cliente gerencia conexões e executa comandos de banco de dados.
Dica
Reutilize seu cliente
Recomendamos que você reutilize seu cliente entre sessões e operações. Você pode utilizar a mesma instância do Client
para executar múltiplas tarefas, em vez de criar outra a cada vez. O Client
tipo é seguro para uso concorrente por várias goroutines. Para saber mais sobre como os pool de conexões funcionam no driver, consulte apágina de perguntas frequentes .
Você pode criar um cliente que use sua cadeia de conexão e outras opções do cliente passando um objeto ClientOptions
para o método Connect()
.
Para especificar seu URI de conexão, passe-o para o método ApplyURI()
, que retorna uma nova instância do ClientOptions
. Para definir quaisquer outras opções, chame o método assistente relevante a partir do pacote options
.
Para saber mais sobre as opções de conexão, consulte a seção Opções de conexão. Para saber mais sobre como criar um cliente, consulte a documentação da API para Cliente e Conectar().
Você pode definir a versão da Stable API como uma opção para evitar alterações interruptivas ao atualizar para uma nova versão do servidor. Para saber mais sobre o recurso Stable API, consulte a página Stable API.
O código a seguir mostra como você pode criar um cliente que utiliza uma cadeia de conexão do Atlas e a versão da Stable API, conectar-se ao MongoDB e verificar se a conexão foi bem-sucedida:
// Connects to MongoDB and sets a Stable API version package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) // Replace the placeholder with your Atlas connection string const uri = "<connection string>" func main() { // Use the SetServerAPIOptions() method to set the Stable API version to 1 serverAPI := options.ServerAPI(options.ServerAPIVersion1) opts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPI) // Create a new client and connect to the server client, err := mongo.Connect(context.TODO(), opts) if err != nil { panic(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { panic(err) } }() // Send a ping to confirm a successful connection var result bson.M if err := client.Database("admin").RunCommand(context.TODO(), bson.D{{"ping", 1}}).Decode(&result); err != nil { panic(err) } fmt.Println("Pinged your deployment. You successfully connected to MongoDB!") }
Dica
Siga o Guia de início rápido para recuperar sua cadeia de conexão do Atlas.
Observação
Para saber mais sobre como se conectar ao Atlas sem servidor, consulte a página Limitações da instância sem servidor para identificar a versão mínima de driver necessária.
Outras maneiras de se conectar ao MongoDB
Se estiver se conectando a uma única instância ou conjunto de réplicas do servidor MongoDB que não esteja hospedado no Atlas, consulte as seções a seguir para saber como se conectar.
Conecte-se a um servidor MongoDB em sua máquina local
Se você precisa executar um servidor MongoDB em sua máquina local para fins de desenvolvimento, complete as seguintes etapas:
Baixe a versão Comunidade ou Enterprise do MongoDB Server.
Instale e configure o servidor MongoDB.
Inicie o servidor.
Importante
Sempre proteja seu servidor do MongoDB contra ataques maliciosos. Consulte nossa Lista de verificação de segurança para obter uma lista de recomendações de segurança.
Depois de iniciar com êxito o servidor MongoDB, especifique a connection string no código de conexão do driver.
Se o servidor MongoDB estiver sendo executado localmente, você poderá usar a connection string "mongodb://localhost:<port>"
, em que <port>
é o número da porta que você configurou no servidor para escutar as conexões de entrada.
Se você quiser especificar um nome de host ou endereço IP diferente, consulte a entrada do Manual do servidor sobre strings de conexão.
Para testar se você pode se conectar ao servidor, substitua a cadeia de conexão pela do localhost no exemplo de código anterior.
Conectar a um conjunto de réplicas
Uma implantação do conjunto de réplicas MongoDB é um grupo de instâncias conectadas que armazenam o mesmo conjunto de dados. Esta configuração fornece redundância de dados e alta disponibilidade de dados.
Para conectar a uma implantação do conjunto de réplicas, especifique o nome do host e os números de porta de cada instância, separados por vírgulas, e o nome do conjunto de réplicas como o valor do parâmetro replicaSet
na cadeia de conexão. No exemplo seguinte, os nomes de host são host1
, host2
e host3
, e os números de porta são todos 27017
. O nome do conjunto de réplicas é myRS
.
mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myRS
Ao se conectar a um conjunto de réplicas, o driver realiza as seguintes ações por padrão:
Descobre todos os membros do conjunto de réplicas quando recebe o endereço de qualquer membro.
Despacha operações para o membro apropriado, como instruções para gravar no primário.
Dica
Você pode especificar apenas um host para se conectar a um conjunto de réplicas. No entanto, para garantir a conectividade quando o host especificado não estiver disponível, forneça a lista completa de hosts.
Conexão direta
Para forçar operações no host designado no URI de conexão, especifique a opção directConnection
. As conexões diretas:
Não oferecem suporte a strings SRV.
Falham nas gravações quando o host especificado não é o primário.
Exigem que você especifique uma preferência de leitura secundária quando o host especificado não é o primário.
Observação
Conjunto de réplicas no Docker
Quando um conjunto de réplicas é executado no Docker, ele pode expor apenas um endpoint MongoDB . Nesse caso, o conjunto de réplicas não é detectável. Especificar directConnection=false
em seu URI de conexão ou deixar essa opção sem definir pode impedir que seu aplicação se conecte a ele.
Em um ambiente de teste ou desenvolvimento, é possível conectar-se ao conjunto de réplicas especificando directConnection=true
. Em um ambiente de produção, recomendamos configurar o cluster para que cada instância do MongoDB seja acessível fora da rede virtual do Docker.
Opções de conexão
Esta seção explica várias opções comuns de conexão e autenticação do MongoDB. Você pode passar as opções de conexão como parâmetros do URI de conexão para especificar o comportamento do cliente.
Nome da opção | Tipo | Valor padrão | Descrição |
---|---|---|---|
timeoutMS | inteiro |
| Especifica o número de milissegundos que uma única operação executada no |
connectTimeoutMS | inteiro |
| Define o tempo de espera em milissegundos antes de uma conexão TCP atingir o tempo limite. |
maxPoolSize | inteiro |
| Define o limite máximo de conexões que um pool de conexões pode ter em um determinado momento. |
replicaSet | string |
| Especifica o nome do conjunto de réplicas para o cluster. Todos os nós no conjunto de réplicas precisam ter o mesmo nome do conjunto de réplicas, caso contrário o cliente não os considerará como parte do conjunto. |
maxIdleTimeMS | inteiro |
| Define o limite de tempo máximo que uma conexão pode ficar inativa no pool de conexões antes de ser eliminada e fechada. O padrão é |
minPoolSize | inteiro |
| Especifica o número mínimo de conexões que o driver mantém em um único pool de conexões. |
socketTimeoutMS | inteiro |
| Define um limite de tempo em milissegundos para esperar por uma resposta de leitura ou gravação de soquete antes de retornar um erro de rede. O valor padrão |
serverSelectionTimeoutMS | inteiro |
| Especifica o número de milissegundos de espera para encontrar um servidor disponível e adequado para executar uma operação. |
heartbeatFrequencyMS | inteiro |
| Define o intervalo de tempo em milissegundos para esperar, entre cada verificação periódica do servidor em segundo plano. |
tls | booleano |
| Especifica se uma conexão TLS (Transport Layer Security) deve ser estabelecida com a instância. Isso é automaticamente definido como |
w | string ou inteiro |
| Define a preocupação de gravação. Para saber mais sobre os valores, consulte a seção Opções de preocupação de gravaçãona documentação do servidor: |
directConnection | booleano |
| Especifica se todas as operações devem ser forçadas a serem despachadas para o host especificado no URI de conexão. |
Para obter uma lista completa das opções de conexão, consulte a documentação da API ClientOptions.
Definição de tempo limite único
Você pode definir uma única opção Timeout
em seu Client
para controlar o tempo que uma única operação pode levar para ser executada usando o método SetTimeout()
ou especificando a opção timeoutMS
em sua string URI de conexão. As instâncias Database
, Collection
, Session
, ChangeStream
e Bucket
em outras partes do seu código herdarão a opção Timeout
de Client
se você não definir um contexto para operações na mesma entidade.
Se você fornecer um contexto para uma operação com um prazo específico, o driver usará esse prazo de contexto para a operação. Se não houver um prazo específico, o driver criará um novo contexto a partir do contexto fornecido, usando a opção Timeout
definida em Client
.
Observação
Novas tentativas com especificação de tempo limite
Com as configurações padrão, se você definir uma opção Timeout
no seu Client
e sua operação exigir uma nova tentativa, o driver tentará novamente a operação quantas vezes forem possíveis antes que o tempo limite expire. Quando o tempo limite expira, o driver retorna um erro de tempo limite. Versões 1.1 e posterior do driver Go permitem leituras e gravações repetíveis por padrão. Consulte o manual do servidor para obter mais informações sobre leituras repetíveis e gravações repetíveis.
O código a seguir mostra como definir a opção Timeout
em um Client
com a opção SetTimeout
:
opts := options.Client().SetTimeout(5 * time.Second)
O exemplo a seguir mostra como definir um tempo limite único com a opção URI e executar uma operação que herda esta configuração:
uri := "mongodb://user:pass@sample.host:27017/?timeoutMS=5000" client := mongo.Connect(uri) coll := client.Database("<db>").Collection("<collection>") ... coll.InsertOne(context.Background(), doc)
Importante
Opções herdadas de tempo limite
SocketTimeout
wTimeout
, MaxTime
e MaxCommitTime
serão descontinuados em uma versão futura. O driver ignora MaxTime
e MaxCommitTime
quando Timeout
está definido. O driver ainda honra SocketTimeout
e wTimeout
, mas essas configurações podem resultar em um comportamento indefinido. Em vez disso, considere usar apenas a opção de tempo limite único.