Docs Menu
Docs Home
/ /

FAQ

Esta página contiene preguntas frecuentes y sus respuestas correspondientes.

Tip

Si no puede encontrar una respuesta a su problema en esta página, consulte la Página deproblemas y ayuda para conocer los próximos pasos y más recursos.

Si tiene problemas para conectarse a una implementación de MongoDB, consulte la Guía de solución de problemas de conexión para obtener posibles soluciones.

Cada Client Cada instancia tiene un grupo de conexiones integrado para cada servidor de su topología MongoDB. Los grupos de conexiones abren sockets a demanda para admitir operaciones simultáneas de MongoDB. goroutines, en su aplicación.

El tamaño máximo de cada grupo de conexiones se establece mediante la opción maxPoolSize, cuyo valor predeterminado es 100. Si el número de conexiones en uso a un servidor alcanza maxPoolSize, la siguiente solicitud a ese servidor esperará hasta que haya una conexión disponible.

La instancia Client abre dos sockets adicionales por servidor en su topología MongoDB para monitorear el estado del servidor.

Por ejemplo, un cliente conectado a un conjunto de 3réplicas de nodos abre 6 sockets de monitorización. También abre los sockets necesarios para admitir las operaciones concurrentes de una aplicación en cada servidor, hasta un valor maxPoolSize de. Si maxPoolSize es 100 y la aplicación solo usa el servidor principal (predeterminado), solo el grupo de conexiones principal crece y puede haber 106 un máximo de conexiones. Si la aplicación usa una preferencia de lectura para consultar los nodos secundarios, sus grupos también crecen y puede haber un 306 total de conexiones.

Además, los pools de conexiones están sujetos a limitaciones de velocidad, de modo que cada pool de conexiones solo puede crear, como máximo, el valor de maxConnecting conexiones en paralelo en cualquier momento. Cualquier goroutine adicional deja de esperar en los siguientes casos:

  • Una de las goroutine existentes termina de crear una conexión, o una conexión existente se devuelve al grupo.

  • La capacidad del controlador para reutilizar conexiones existentes mejora debido a los límites de velocidad en la creación de conexiones.

Puede establecer el número mínimo de conexiones simultáneas a cada servidor con la opción minPoolSize, cuyo valor predeterminado es 0. Tras establecer minPoolSize, el grupo de conexiones se inicializa con este número de sockets. Si los sockets se cierran debido a errores de red, lo que provoca que el número total de sockets (tanto en uso como inactivos) caiga por debajo del mínimo, se abrirán más sockets hasta alcanzarlo.

Puede establecer la cantidad máxima de milisegundos que una conexión puede permanecer inactiva en el grupo antes de ser eliminada y reemplazada con la opción maxIdleTimeMS, cuyo valor predeterminado es None (sin límite).

La siguiente configuración predeterminada para un Client funciona para la mayoría de las aplicaciones:

client := mongo.Connect(context.TODO(), "<connection string>")

Cree un cliente para cada proceso y reutilícelo para todas las operaciones. Es un error común crear un cliente para cada solicitud, lo cual resulta muy ineficiente.

Para admitir un gran número de operaciones simultáneas de MongoDB en un proceso, puede aumentar maxPoolSize. Una vez que el grupo alcanza su tamaño máximo, las operaciones adicionales esperan a que haya sockets disponibles.

El controlador no limita el número de operaciones que pueden esperar a que los sockets estén disponibles, y es responsabilidad de la aplicación limitar el tamaño de su grupo a la cola limitada durante un pico de carga. Las operaciones pueden esperar cualquier tiempo, a menos que se defina la opción waitQueueTimeoutMS.

Una operación que espera más tiempo del definido por waitQueueTimeoutMS para un socket genera un error de conexión. Use esta opción si es más importante limitar la duración de las operaciones durante un pico de carga que completar cada operación.

Cuando cualquier goroutine llama a Client.Disconnect(), el controlador cierra todos los sockets inactivos y cierra todos los sockets que están en uso a medida que se devuelven al grupo.

El bson.Marshal() método requiere un parámetro que pueda decodificarse en un documento BSON, como el bson.D tipo. Este error se produce al pasar un valor distinto de un documento BSON bson.Marshal() a.

El error WriteNull se produce al pasar un null a un bson.Marshal(). Entre las situaciones en las que puede ocurrir un error similar se incluyen las siguientes:

  • Pasa una cadena a bson.Marshal(), lo que provoca un error WriteString.

  • Pasa un valor booleano a bson.Marshal(), lo que provoca un error WriteBoolean.

  • Pasa un entero a bson.Marshal(), lo que provoca un error WriteInt32.

Puede encontrar este error cuando realiza una operación CRUD que utiliza internamente el método bson.Marshal() o cuando llama a bson.Marshal() directamente para codificar datos.

El siguiente código produce un error WriteNull porque el controlador no puede codificar el valor null de sortOrder a BSON durante la operación 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)
}

El siguiente código muestra cómo inicializar correctamente la variable sortOrder como tipo bson.D para que el controlador pueda convertirla a BSON:

sortOrder := bson.D{}

El controlador proporciona diversos métodos de serialización que permiten convertir un documento BSON a JSON, como el método MarshalExtJSON(). Para ver una forma legible de la codificación JSON, debe usar un método de desmarshaler o una conversión de tipos de cadena para analizar el formato de bytes JSON.

El siguiente código convierte un documento BSON a JSON usando el método MarshalExtJSON(), luego analiza e imprime la matriz de bytes JSON usando conversión de tipo de cadena:

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

Para obtener más información sobre las conversiones entre los tipos BSON y Go, consulte la guía Trabajar con BSON.

Volver

Datos geoespaciales

En esta página