Menu Docs
Página inicial do Docs
/ / /
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 instância Client tem um pool de conexões integrado para cada servidor em sua topologia do MongoDB. Os pools de conexões abrem soquetes sob demanda para oferecer suporte às operações simultâneas do MongoDB ou goroutines , em seu aplicativo.

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 nó 3abre 6 soquetes de monitoramento. Ele também abre quantos soquetes forem 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 somente o primary (o padrão), somente o pool de conexões primary crescerá e poderá haver no máximo 106 conexões totais. Se o aplicativo usar uma read preference para consultar os nós secundários, seus pools também crescerão e poderá haver 306 total de conexões.

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 := mongo.Connect("<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 transferência 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 unmarshaller 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))

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

Voltar

Trabalhar com Dados Geoespaciais

Próximo

Solução de problemas de conexão