Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /

Configurar las operaciones CRUD

En esta guía, puedes aprender cómo usar el driver de Go para configurar las operaciones de lectura y escritura.

Puede controlar cómo el controlador enruta las operaciones de lectura estableciendo una preferencia de lectura. También se puede controlar cómo el driver gestiona la coherencia y durabilidad de los datos estableciendo un nivel de consistencia de lectura o un nivel de confirmación de escritura (write concern). Los niveles de consistencia de lectura especifican el nivel de durabilidad requerido para los datos al realizar operaciones de lectura, y los niveles de confirmación de escritura (write concern) especifican cómo el controlador espera el reconocimiento 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 creciente de prioridad de los ajustes de opciones. Por ejemplo, si estableces un nivel de consistencia de lectura para una transacción, esto anulará el nivel de consistencia de lectura establecido para el cliente.

Un nivel de confirmación de escritura (write concern) describe el número de miembros con datos en un set de réplicas que deben confirmar una operación de escritura, como una inserción o actualización, antes de que la operación se considere exitosa. Por defecto, la operación de escritura es exitosa si solo el miembro principal del conjunto de réplicas la reconoce.

El controlador MongoDB Go proporciona el writeconcern El paquete, que permite especificar el nivel de confirmación de escritura (write concern) para un set de réplicas. Establezca el nivel de confirmación de escritura (write concern) pasando una instancia del tipo WriteConcern al método SetWriteConcern(). El tipo WriteConcern proporciona los siguientes métodos para seleccionar especificaciones comunes de nivel de confirmación de escritura (write concern):

Método
Descripción

Custom()

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)

Journaled()

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

Majority()

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

Unacknowledged()

The client requests requests no acknowledgment of write operations. For more information, see the Write Concern specification for w: 0.

Parameter: none

W1()

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

W

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

Journal

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.

El siguiente código muestra cómo se pueden especificar diferentes nivel de confirmación de escritura (write concern) a nivel de cliente y de colección. El nivel de confirmación de escritura (write concern) a nivel de cliente solicita una confirmación de dos miembros del conjunto de réplicas y establece el registro en diario en false. La colección-level nivel de confirmación de escritura (write concern) solicita el reconocimiento 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)

La opción de nivel de consistencia de lectura permite determinar qué datos devuelve el cliente desde una consulta. El nivel de consistencia 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 los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicas.

El driver Go de MongoDB proporciona el paquete readconcern, que te permite especificar el nivel de consistencia de lectura para un set de réplicas. Establezca el nivel de consistencia de lectura pasando una instancia de un tipo ReadConcern al método SetReadConcern(). El tipo ReadConcern tiene los siguientes métodos para establecer el nivel de consistencia de lectura:

Método
Descripción

Available()

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.

Linearizable()

La query devuelve datos que reflejan todas las escrituras exitosas emitidas con un nivel de confirmación de escritura (write concern) de majority y aceptados antes de que comience la operación de lectura. Para más información, consulta la especificación de nivel de consistencia de lectura.

Local()

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.

Majority()

La query devuelve los datos más recientes de la instancia, reconocidos como escritos en la mayoría de los miembros del conjunto de réplicas. Para más información, vea la especificación de nivel de consistencia de lectura.

Snapshot()

La query devuelve una copia completa de los datos en una instancia de mongod en un momento específico en el tiempo. Esta opción está disponible solo para operaciones dentro de transacciones multidocumento. Para más información, consulta la especificación de nivel de consistencia de lectura.

El siguiente código muestra cómo puedes especificar un nivel de consistencia 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)

La opción de preferencia de lectura especifica cómo el cliente de MongoDB enruta las operaciones de lectura a los nodos de un set de réplicas. Por defecto, una aplicación dirige sus operaciones de lectura al miembro principal de un set 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.

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

Nearest()

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.

Primary()

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.

PrimaryPreferred()

El cliente lee desde el nodo primario si está disponible. Si el nodo primario no está disponible, las operaciones se leen de los nodos secundarios. Para obtener más información, consulte la entrada del manual Preferencia de Lectura para el Servidor.

Secondary()

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.

SecondaryPreferred()

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.

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)

El controlador de Go vuelve a intentar automáticamente ciertas operaciones de lectura y escritura una sola vez si fallan debido a un error de red o de 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 desactiva las lecturas y escrituras reintentiables para un cliente mediante las funciones de ajuste 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.

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.

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.

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.

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)
}

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 antecede 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 predeterminada de books, el método Find() sigue las reglas predeterminadas de intercalación binaria para determinar los valores de name que preceden a "Infinite Jest". Estas reglas sitúan palabras que comienzan con "Ç" después de las que comienzan con "I". La salida se asemeja a la siguiente:

{"name":"Emma","length":"474"}
{"name":"Cryptonomicon","length":"918"}

Para obtener más información sobre el método Find(), consulta Buscar documentos.

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().

Después de crear la colección books y aplicar una intercalación por defecto, como se muestra en la sección Ejemplo de creación de una colección, no se puede cambiar la intercalación por defecto de la colección. Sin embargo, 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

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.

Puede usar operaciones que admitan la intercalación para actualizar y query documentos en la colección books.

El siguiente ejemplo usa el método Find() para devolver documentos en los que el valor length es mayor que "1000". El campo de intercalación NumericOrdering tiene un valor de true para asegurar que los valores se ordenen en orden numérico en lugar de orden alfabético:

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"}

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:

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:

Volver

Operaciones compuestas