Guia de conexão
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ê precisa criar um cliente. Um cliente gerencia conexões e executa comandos de banco de dados 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:
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ê precisar executar um servidor MongoDB em seu computador local para fins de desenvolvimento, será necessário concluir o seguinte:
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ê precisar 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ê só precisa especificar 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.
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 | null | Especifica o número de milissegundos que uma única operação executada no Client pode levar antes de retornar um erro de tempo limite. As operações honram esta configuração somente quando não há prazo no contexto da operação. |
connectTimeoutMS | inteiro | 30000 | Define o tempo de espera em milissegundos antes de uma conexão TCP atingir o tempo limite. |
maxPoolSize | inteiro | 100 | Define o limite máximo de conexões que um pool de conexões pode ter em um determinado momento. |
replicaSet | string | null | 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 | 0 | 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 é 0 , o que significa que uma conexão pode ficar inativa por tempo indeterminado. |
minPoolSize | inteiro | 0 | Especifica o número mínimo de conexões que o driver mantém em um único pool de conexões. |
socketTimeoutMS | inteiro | 0 | 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 0 significa que não existe um limite de tempo. |
serverSelectionTimeoutMS | inteiro | 30000 | Especifica o número de milissegundos de espera para encontrar um servidor disponível e adequado para executar uma operação. |
heartbeatFrequencyMS | inteiro | 10000 | Define o intervalo de tempo em milissegundos para esperar, entre cada verificação periódica do servidor em segundo plano. |
tls | booleano | false | Especifica se uma conexão TLS (Transport Layer Security) deve ser estabelecida com a instância. Isso é automaticamente definido como true ao usar um seedlist de DNS (SRV) na cadeia de conexão. Você pode substituir esse comportamento definindo o valor como false . |
w | string ou inteiro | null | 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 | false | 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.