Menu Docs
Página inicial do Docs
/ / /
Driver GO

Perguntas frequentes

Nesta página

  • Por que estou recebendo erros ao conectar ao MongoDB?
  • Como funciona o pool de conexões no driver Go?
  • Como posso corrigir o erro "WriteNull só pode gravar enquanto estiver posicionado em um elemento ou valor, mas está posicionado em um TopLevel"?
  • Como converto um documento BSON em JSON?

Esta página contém perguntas frequentes e suas respostas correspondentes.

Dica

Se você não conseguir encontrar uma resposta para seu problema nesta página, consulte a página Problemas e ajuda para ver as próximas etapas e mais recursos.

Se você tiver problemas para se conectar a um sistema do MongoDB, consulte o Guia de Solução de Problemas de Conexão para obter possíveis soluções.

Cada Client instância tem um pool de conexões integrado para cada servidor em sua topologia do MongoDB . Os pools de conexão abrem soquetes sob demanda para oferecer suporte às operações simultâneas do MongoDB , ou goroutines, em seu aplicação.

O tamanho máximo de cada conjunto de conexões é definido pela opção maxPoolSize, que padroniza para 100. Se o número de conexões em uso com um servidor atingir o valor de maxPoolSize, a próxima solicitação para esse servidor aguardará até que uma conexão fique disponível.

A instância Client abre dois soquetes adicionais por servidor na sua topologia do MongoDB para monitorar o estado do servidor.

Por exemplo, um cliente conectado a um conjunto de réplicas de 3 nós abre 6 soquetes de monitoramento. Ele também abre os soquetes necessários para suportar as operações simultâneas de um aplicativo em cada servidor, até o valor de maxPoolSize. Se maxPoolSize for 100 e o aplicativo usar apenas o primário (o padrão), somente o pool de conexões primário crescerá e poderá haver no máximo 106 total de conexões. Se o aplicativo usar uma preferência de leitura para executar a query dos nós secundários, seus pools também aumentarão e poderá haver 306 de conexões totais.

Além disso, os pools de conexões são limitados por taxa, de modo que cada pool de conexões só pode criar, no máximo, o valor de maxConnecting conexões em paralelo a qualquer momento. Qualquer goroutine adicional para de esperar nos seguintes casos:

  • Uma das goroutines existentes termina de criar uma conexão ou uma conexão existente é verificada novamente no pool.

  • A capacidade do driver de reutilizar conexões existentes melhora devido aos limites de taxa na criação de conexões.

Você pode definir o número mínimo de conexões simultâneas para cada servidor usando a opção minPoolSize, cujo padrão é 0. Depois de definir minPoolSize, o pool de conexões é inicializado com esse número de soquetes. Se os soquetes fecharem devido a erros de rede, fazendo com que o número total de soquetes (em uso e ociosos) caia abaixo do mínimo, mais soquetes serão abertos até que o mínimo seja atingido.

Você pode definir o número máximo de milésimos de segundo que uma conexão pode permanecer ociosa no grupo antes de ser removida e substituída pela opção maxIdleTimeMS , que padroniza para None (sem limite).

A seguinte configuração padrão para um Client funciona para a maioria dos aplicativos:

client, err := mongo.Connect(options.Client().ApplyURI("<connection string>"))

Crie um cliente uma vez para cada processo e reutilize-o para todas as operações. É um erro comum criar um novo cliente para cada solicitação, o que é muito ineficiente.

Para oferecer suporte a um grande número de operações simultâneas do MongoDB em um processo, você pode aumentar maxPoolSize. Quando o pool atinge seu tamanho máximo, operações adicionais aguardam que os soquetes fiquem disponíveis.

O driver não limita o número de operações que podem aguardar a disponibilidade de soquetes e é responsabilidade do aplicativo limitar o tamanho de seu pool para limitar o enfileiramento durante um pico de carga. As operações podem esperar por qualquer período, a menos que você defina a opção waitQueueTimeoutMS.

Uma operação que aguarda mais do que o período de tempo definido por waitQueueTimeoutMS para um soquete gera um erro de conexão. Use essa opção se for mais importante limitar a duração das operações durante um pico de carga do que concluir cada operação.

Quando Client.Disconnect() é chamado por qualquer goroutine, o driver fecha todos os soquetes ociosos e fecha todos os soquetes que estão em uso à medida que são retornados ao pool.

O método bson.Marshal() exige um parâmetro que pode ser decodificado em um documento BSON, como o tipo bson.D . Esse erro ocorre quando você passa algo que não é um documento BSON para bson.Marshal().

O erro WriteNull ocorre quando você passa um null para bson.Marshal(). As situações em que um erro semelhante pode ocorrer incluem o seguinte:

  • Você passa uma string para bson.Marshal(), causando um erro WriteString.

  • Você passa um booleano para bson.Marshal(), causando um erro WriteBoolean.

  • Você passa um número inteiro para bson.Marshal(), causando um erro WriteInt32 .

Você pode encontrar esse erro ao executar uma operação CRUD que usa internamente o método bson.Marshal() ou ao chamar bson.Marshal() diretamente para codificar dados.

O seguinte código produz um erro WriteNull porque o driver não pode codificar o valor null de sortOrder para BSON durante a operação FindOneAndUpdate() :

var sortOrder bson.D
opts := options.FindOneAndUpdate().SetSort(sortOrder)
updateDocument := bson.D{{"$inc", bson.D{{"counter", 1}}}}
result := coll.FindOneAndUpdate(context.TODO(), bson.D{}, updateDocument, opts)
if err := result.Err(); err != nil {
panic(err)
}

O código a seguir mostra como inicializar corretamente a variável sortOrder como um tipo bson.D para que o driver possa convertê-la em BSON:

sortOrder := bson.D{}

O driver fornece uma variedade de métodos de empacotador que podem ser usados para converter um documento BSON em JSON, como o método MarshalExtJSON() . Para visualizar uma forma legível da codificação JSON, você deve usar um método unmarshaler ou uma conversão de tipo de string para analisar o formato de byte JSON.

O código a seguir converte um documento BSON em JSON usando o método MarshalExtJSON() e, em seguida, analisa e imprime a array de bytes JSON usando conversão de tipo de string:

bsonDocument := bson.D{{"hello", "world"}}
jsonBytes, err := bson.MarshalExtJSON(bsonDocument, true, false)
if err != nil {
panic(err)
}
fmt.Println(string(jsonBytes))
{"hello":"world"}

Para saber mais sobre conversões entre os tipos BSON e Go, consulte o guia Trabalhar com BSON.

Voltar

Dados geoespaciais