Overview
En esta guía, puedes aprender cómo usar el driver de Go para configurar las operaciones de lectura y escritura.
Ajustes de lectura y guardar
Puede controlar cómo el controlador enruta las operaciones de lectura configurando una preferencia de lectura. También puede controlar cómo gestiona la consistencia y durabilidad de los datos configurando una preocupación de lectura o de escritura. Las preocupaciones de lectura especifican el nivel de durabilidad requerido para los datos al realizar operaciones de lectura, y las preocupaciones de escritura especifican cómo espera el controlador la confirmación de las operaciones de escritura en un conjunto de réplicas.
Puedes establecer las opciones de nivel de confirmación de escritura (write concern), nivel de consistencia de lectura y preferencia de lectura en los siguientes niveles:
A nivel de cliente, que establece por defecto para todas las ejecuciones de operaciones, a menos que se sobrescriba.
Nivel de sesión
Nivel de transacción
Nivel de base de datos
A nivel de colección
La lista anterior también indica el orden de precedencia creciente de las opciones. Por ejemplo, si se configura una solicitud de lectura para una transacción, esta anulará la solicitud de lectura establecida para el cliente.
Nivel de confirmación de escritura
Una preocupación de escritura describe el número de miembros de un conjunto de réplicas que contienen datos y que deben confirmar una operación de escritura, como una inserción o una actualización, antes de que esta se considere exitosa. De forma predeterminada, la operación de escritura se considera exitosa si solo la confirma el miembro principal del conjunto de réplicas.
opciones
El controlador MongoDB Go proporciona el writeconcern Paquete que permite especificar la preocupación de escritura para un conjunto de réplicas. Establezca la preocupación de escritura pasando una instancia del tipo WriteConcern al método SetWriteConcern(). El tipo WriteConcern proporciona los siguientes métodos para seleccionar especificaciones comunes de preocupación de escritura:
Método | Descripción |
|---|---|
| The client requests acknowledgement that write operations propagate to
tagged members of a mongod instance. For more
information, see the Write Concern specification.Parameter: tag (string) |
| The client requests acknowledgement that the replica set has
written the changes to the on-disk journal. For more information, see the
Write Concern specification. Parameter: none |
| The client requests acknowledgement that write operations propagate to the
majority of data-bearing voting members. For more information, see the
Write Concern specification. Parameter: none |
| The client requests requests no acknowledgment of write
operations. For more information, see the
Write Concern specification for w: 0. Parameter: none |
| The client requests acknowledgement that the replica set has
written the changes to memory on one node, such as the standalone mongod or
the primary in a replica set. For more
information, see the Write Concern specification for w: 1. Parameter: none |
Tip
WriteConcernTimeout
No puedes establecer un tiempo de espera en una instancia de WriteConcern. En su lugar, configura el tiempo de espera a nivel de operación usando el método WithTimeout() al crear un Contexto. Para aprender más, consulta
Limitar el tiempo de ejecución del servidor en la guía Opciones de conexión.
Si necesitas un nivel de confirmación de escritura (write concern) más especializado, puedes definir un literal de struct personalizado WriteConcern. Puedes configurar los siguientes campos en una estructura WriteConcern:
Campo | Descripción |
|---|---|
| Specifies the number of mongod instances or tagged members
that write operations must propagate to for acknowledgement. Common values include
1, 0, and "majority".Type: string or int |
| Specifies whether the replica set must write the changes to the on-disk
journal for acknowledgement. Type: bool |
Tip
Alternativamente, puedes especificar un nivel de confirmación de escritura (write concern) en tu cadena de conexión. Consulta la entrada del manual del servidor sobre Opciones de Nivel de confirmación de escritura (write concern) para más información.
Ejemplo
El siguiente código muestra cómo especificar diferentes preocupaciones de escritura a nivel de cliente y de colección. La preocupación de escritura a nivel de cliente solicita la confirmación de dos miembros del conjunto de réplicas y establece el registro en diario en false. La preocupación de escritura a nivel de colección solicita la confirmación de la mayoría de los miembros del conjunto de réplicas.
uri := "mongodb://<hostname>:<port>" journal := false cliWC := &writeconcern.WriteConcern{ W: 2, Journal: &journal, } clOpts := options.Client().ApplyURI(uri).SetWriteConcern(cliWC) client, err := mongo.Connect(clOpts) ... collWC := writeconcern.Majority() collOpts := options.Collection().SetWriteConcern(collWC) coll := client.Database("db").Collection("myColl", collOpts)
readConcern
La opción de lectura permite determinar qué datos devuelve el cliente tras una consulta. El nivel de lectura predeterminado es "local", lo que significa que el cliente devuelve los datos más recientes de la instancia, sin garantía de que se hayan escrito en la mayoría de los miembros del conjunto de réplicas.
opciones
El controlador Go de MongoDB proporciona el paquete readconcern, que permite especificar la preocupación de lectura para un conjunto de réplicas. Establezca la preocupación de lectura pasando una instancia de tipo ReadConcern al método SetReadConcern(). El tipo ReadConcern tiene los siguientes métodos para especificar la preocupación de lectura:
Método | Descripción |
|---|---|
| La query devuelve datos de la instancia sin garantía de que los datos hayan sido escritos en la mayoría de los miembros del set de réplicas. Para obtener más información, consulte la especificación de nivel de consistencia de lectura. |
| La query devuelve datos que reflejan todas las escrituras exitosas emitidas con un nivel de confirmación de escritura (write concern) de |
| La query devuelve los datos más recientes de la instancia. Para obtener más información, consulte la especificación de nivel de consistencia de lectura. |
| La consulta devuelve los datos más recientes de la instancia que se reconocen como escritos por la mayoría de los miembros del conjunto de réplicas. Para obtener más información, consulte la especificación de Read Concern. |
| La query devuelve una copia completa de los datos en una instancia de |
Ejemplo
El siguiente código muestra cómo especificar una preocupación de lectura de "mayoría". El código selecciona un Collection con esta opción.
rc := readconcern.Majority() opts := options.Collection().SetReadConcern(rc) database := client.Database("db") coll := database.Collection("myCollection", opts)
preferencia de lectura
La opción de preferencia de lectura especifica cómo el cliente MongoDB enruta las operaciones de lectura a los miembros de un conjunto de réplicas. De forma predeterminada, una aplicación dirige sus operaciones de lectura al miembro principal de un conjunto de réplicas.
La preferencia de lectura consiste en el modo de preferencia de lectura y, opcionalmente, una lista de conjunto de etiquetas, la opción maxStalenessSeconds y la opción lectura protegida.
opciones
El MongoDB Go Driver proporciona el paquete readpref, que permite especificar la preferencia de lectura para un set de réplicas. Establece la preferencia de lectura pasando una instancia del tipo ReadPref al método SetReadPreference(). El tipo ReadPref tiene los siguientes métodos para especificar la preferencia de lectura:
Método | Descripción |
|---|---|
| El cliente lee desde un miembro aleatorio del set de réplicas elegibles, en función de un umbral de latencia especificado. Para obtener más información, consulte la entrada del manual de Preferencias de Lectura del Servidor. |
| El cliente lee desde el nodo primario actual del set de réplicas. Para obtener más información, consulte la entrada del manual de Preferencias de Lectura del Servidor. |
| El cliente lee desde el nodo principal si está disponible. Si el principal no está disponible, las operaciones leen desde los miembros secundarios. Para más información, consulte la entrada del manual "Servidor de preferencias de lectura". |
| El cliente lee desde los miembros secundarios del set de réplicas. Para obtener más información, consulta la entrada del manual del servidor de preferencia de lectura. |
| El cliente lee de los nodos secundarios si hay uno o más disponibles. Si los secundarios no están disponibles, las operaciones se leen desde el miembro primario. Para más información, consulta la entrada del manual de preferencias de lectura del servidor. |
Tip
Alternativamente, puedes especificar una preferencia de lectura en tu cadena de conexión. Consulta la entrada del manual del servidor sobre Opciones de Preferencia de Lectura para obtener más información.
Ejemplo
El siguiente código muestra cómo puedes especificar una preferencia de lectura para leer desde nodos secundarios. A continuación, el código selecciona un Database con esta opción.
rp := readpref.Secondary() opts := options.Database().SetReadPreference(rp) database := client.Database("db", opts)
Lecturas y Guardados Reintentarles
El controlador Go vuelve a intentar automáticamente ciertas operaciones de lectura y escritura una sola vez si fallan debido a un error de red o servidor.
Puedes deshabilitar explícitamente las lecturas reintentables o las escrituras reintentables configurando la opción RetryReads o RetryWrites en False al crear un nuevo cliente utilizando la estructura options.Client.
El siguiente ejemplo deshabilita las lecturas y escrituras reintentables para un cliente mediante las funciones de establecimiento ClientOptions:
// Defines the client options clientOps := options.Client(). ApplyURI(uri). SetRetryWrites(false). SetRetryReads(false) // Creates a new client using the specified options client, err := mongo.Connect(clientOps) if err != nil { panic(err) }
Para obtener más información sobre las operaciones de lectura repetibles admitidas, consulte Lecturas repetibles en el manual de MongoDB Server. Para obtener más información sobre las operaciones de escritura reintentables admitidas, consulta Escrituras reintentables en el manual del MongoDB Server.
Intercalación
Puedes especificar una intercalación para modificar el comportamiento de las operaciones de lectura y escritura. Una intercalación es un conjunto de reglas específicas de cada lenguaje para la comparación de strings, como las relacionadas con las mayúsculas y los signos diacríticos.
Por defecto, MongoDB ordena las cadenas utilizando intercalación binaria. Esta intercalación por defecto utiliza los valores de caracteres estándar ASCII para comparar y ordenar cadenas. Los idiomas y las configuraciones regionales tienen convenciones específicas de ordenación de caracteres que difieren del estándar ASCII, y puedes elegir aplicar un conjunto diferente de reglas de intercalación en tu operación.
Puede especificar una intercalación en los siguientes niveles:
Colección: Establece la intercalación por defecto para las operaciones en la colección. No puede definir una intercalación para una colección existente.
Índice: Establece la intercalación para las operaciones que utilizan el índice.
Operation: establece la intercalación de la operación y anula cualquier intercalación heredada.
Especifica una intercalación
Para especificar una intercalación, crea un objeto Collation. Debes definir el campo Locale del objeto Collation, pero todos los demás campos son opcionales. Por ejemplo, el siguiente ejemplo de código especifica un objeto Collation con la intercalación de localización de "en_US":
myCollation := &options.Collation{Locale: "en_US"}
Para obtener una lista completa de los campos de Collation objeto, visita la documentación de la API de intercalación. Para ver todas las localizaciones admitidas y los valores predeterminados de los campos Locale, visita Idiomas y localizaciones admitidas.
Establecer una intercalación en una colección o vista
Puedes aplicar una intercalación al crear una colección o vista nueva. Esto define la intercalación por defecto para cualquier operación que se realice en esa colección o vista. Establecer una intercalación a través de un objeto CreateCollectionOptions o CreateViewOptions. Luego, llama al método CreateCollection() o CreateView() con tu objeto de opciones como argumento.
Crear un ejemplo de colección
El siguiente ejemplo crea una nueva colección llamada books y especifica una intercalación por defecto con la localización "fr". El campo de intercalación Strength tiene un valor de 1 para ignorar las diferencias en los acentos de las letras.
myCollation := &options.Collation{Locale: "fr", Strength: 1} opts := options.CreateCollection().SetCollation(myCollation) err := db.CreateCollection(context.TODO(), "books", opts) if err != nil { panic(err) }
Use el ejemplo de intercalación por defecto
Si llamas a una operación que utiliza una intercalación en la colección books, la operación utiliza la intercalación predeterminada especificada en el Ejemplo de creación de una colección.
Suponga que la colección books contiene los siguientes documentos:
{"name" : "Emma", "length" : "474"} {"name" : "Les Misérables", "length": "1462"} {"name" : "Infinite Jest", "length" : "1104"} {"name" : "Cryptonomicon", "length" : "918"} {"name" : "Ça", "length" : "1138"}
Nota
Para aprender a insertar documentos, consulte Insertar documentos.
El siguiente ejemplo utiliza el método Find() para devolver todos los documentos con un valor name que precede alfabéticamente a "Infinite Jest":
filter := bson.D{{"name", bson.D{{"$lt", "Infinite Jest"}}}} cursor, err := coll.Find(context.TODO(), filter) if err != nil { panic(err) } var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"name":"Emma","length":"474"} {"name":"Cryptonomicon","length":"918"} {"name":"Ça","length":"1138"}
Si el código no especifica una intercalación books predeterminada, el método Find() sigue las reglas de intercalación binaria predeterminadas para determinar los valores name que preceden a "Infinite Jest". Estas reglas colocan las palabras que empiezan por "Ç" después de las que empiezan por "I". El resultado es similar al siguiente:
{"name":"Emma","length":"474"} {"name":"Cryptonomicon","length":"918"}
Para obtener más información sobre el método Find(), consulta Buscar documentos.
Establece una intercalación en un índice
Puede aplicar una intercalación al crear un nuevo índice en una colección. El índice almacena una representación ordenada de los documentos en la colección, por lo que tu instancia de MongoDB no realiza la ordenación para las operaciones de ordenamiento en memoria.
Para utilizar el índice en una operación, su operación debe utilizar la misma intercalación que la especificada en el índice. Además, asegúrate de que la operación esté cubierta por el índice que contiene la intercalación. Establece una intercalación a través de un objeto IndexOptions y pasa este objeto como argumento al método CreateOne().
Ejemplo
Después de crear la books colección y aplicar una intercalación predeterminada, como se muestra en la sección "Ejemplo de creación de una colección", no se puede cambiar la intercalación predeterminada de la colección. Sin embargo, se puede crear un índice para la colección con una intercalación diferente.
El siguiente ejemplo utiliza el método CreateOne() para crear un índice ascendente en el campo name y especifica una nueva intercalación con una localización "en_US":
myCollation := &options.Collation{Locale: "en_US"} opts := options.Index().SetCollation(myCollation) indexModel := mongo.IndexModel{ Keys: bson.D{{"name", 1}}, Options: opts, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) } fmt.Println("Name of Index Created: " + name)
Name of Index Created: name_1
Establecer una intercalación en una operación
Las operaciones que leen, actualizan y eliminan documentos de una colección pueden utilizar intercalaciones. Al aplicar una intercalación a una operación se anula cualquier intercalación por defecto previamente definida para una colección.
Si aplicas una nueva intercalación a una operación que difiere de la intercalación de un índice, no puedes usar ese índice. Por lo tanto, la operación puede no tener el mismo rendimiento que una operación cubierta por un índice. Para obtener más información sobre las desventajas de las operaciones de ordenación que no están cubiertas por un índice, consulta Uso de índices para ordenar los resultados de query. Consulta el manual de MongoDB para obtener una lista de operaciones que admiten intercalación.
Ejemplo
Puede usar operaciones que admitan la intercalación para actualizar y query documentos en la colección books.
El siguiente ejemplo utiliza el método Find() para devolver documentos cuyo valor length es mayor que "1000". El campo de intercalación NumericOrdering tiene un valor de true para garantizar que los valores se ordenen numéricamente en lugar de alfabéticamente:
filter := bson.D{{"length", bson.D{{"$gt", "1000"}}}} myCollation := &options.Collation{Locale: "en_US", NumericOrdering: true} opts := options.Find().SetCollation(myCollation) cursor, err := coll.Find(context.TODO(), filter, opts) if err != nil { panic(err) } var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { res, _ := bson.MarshalExtJSON(result, false, false) fmt.Println(string(res)) }
{"name":"Les Misérables","length":"1462"} {"name":"Infinite Jest","length":"1104"} {"name":"Ça","length":"1138"}
Si el código no especifica una intercalación con un campo NumericOrdering configurado en true, la misma operación Find() compara los valores length como cadenas. En ese caso, la salida se parece a lo siguiente:
{"name":"Emma","length":"474"} {"name":"Les Misérables","length":"1462"} {""name":"Infinite Jest","length":"1104"} {"name":"Cryptonomicon","length":"918"} {"name":"Ça","length":"1138"}
Información Adicional
Para obtener más información sobre el método Find(), consulta la guía Buscar Documentos.
Para aprender más sobre los conceptos discutidos en esta guía, visita las siguientes páginas manuales:
Documentación de la API
Para obtener más información sobre los métodos que se abordan en esta guía, consulte la siguiente documentación de la API: