Perguntas frequentes
Nesta página
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.
Por que estou recebendo erros ao conectar ao MongoDB?
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.
Como funciona o pool de conexões no driver Go?
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 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 := mongo.Connect(context.TODO(), "<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.
Como posso corrigir o erro "WriteNull só pode gravar enquanto estiver posicionado em um elemento ou valor, mas está posicionado em um TopLevel"?
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 erroWriteString
.Você passa um booleano para
bson.Marshal()
, causando um erroWriteBoolean
.Você passa um número inteiro para
bson.Marshal()
, causando um erroWriteInt32
.
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{}
Como converto um documento BSON em JSON?
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))
Para saber mais sobre conversões entre os tipos BSON e Go, consulte o guia Trabalhar com BSON.