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 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.
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))
{"hello":"world"}
Para saber mais sobre conversões entre os tipos BSON e Go, consulte o guia Trabalhar com BSON.