Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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 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.

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.

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

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

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.

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

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

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

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.

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

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

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

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

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

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