Docs Menu
Docs Home
/ /

Configurar las operaciones CRUD

En esta guía, puede aprender a utilizar el controlador Go para configurar 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.

Puede establecer opciones de preocupación de escritura, preocupación de lectura y preferencia de lectura en los siguientes niveles:

  • Nivel de cliente, que establece el valor predeterminado para todas las ejecuciones de operaciones a menos que se anule

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

Tiempo de espera para escribir inquietudes

No se puede establecer un tiempo de espera en una instancia WriteConcern. En su lugar, establezca el tiempo de espera a nivel de operación mediante el método WithTimeout() al crear un contexto. Para obtener más información, consulte 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 consulta devuelve datos de la instancia sin garantizar que se hayan escrito en la mayoría de los miembros del conjunto de réplicas. Para obtener más información, consulte la especificación de Read Concern.

Linearizable()

La consulta devuelve datos que reflejan todas las escrituras exitosas emitidas con un problema de escritura de majority y confirmadas antes de que comience la operación de lectura. Para obtener más información, consulte la especificación de problemas de lectura.

Local()

La consulta devuelve los datos más recientes de la instancia. Para obtener más información, consulte la especificación de Read Concern.

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 consulta devuelve una copia completa de los datos en una mongod instancia en un momento específico. Esta opción solo está disponible para operaciones dentro de transacciones con varios documentos. Para obtener más información, consulte la especificación de Read Concern.

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 consta del modo de preferencia de lectura y, opcionalmente, una lista de conjuntos de etiquetas, la opción maxStalenessSeconds y la opción de lectura cubierta.

El controlador Go de MongoDB proporciona el paquete readpref, que permite especificar la preferencia de lectura para un conjunto de réplicas. Establezca 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 de un miembro aleatorio del conjunto de réplicas elegible, según un umbral de latencia especificado. Para obtener más información, consulte la entrada del manual "Servidor de preferencia de lectura".

Primary()

El cliente lee desde el nodo principal del conjunto de réplicas actual. Para obtener más información, consulte la entrada del manual "Servidor de preferencias de lectura".

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 de los miembros secundarios del conjunto de réplicas. Para más información, consulte la entrada del manual "Servidor de preferencias 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

Como alternativa, puede especificar una preferencia de lectura en su cadena de conexión. Consulte la sección "Opciones de preferencia de lectura" del manual del servidor para obtener más información.

El siguiente código muestra cómo especificar una preferencia de lectura para leer desde nodos secundarios. 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.

Puede deshabilitar explícitamente las lecturas o escrituras reintentables configurando la opción RetryReads o RetryWrites en False al crear un nuevo cliente mediante 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 reintentable compatibles, consulte "Lecturas reintentables" en el manual de MongoDB Server. Para obtener más información sobre las operaciones de escritura reintentable compatibles, consulte "Escrituras reintentables" en el manual de MongoDB Server.

Puede 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 del lenguaje para la comparación de cadenas, como el uso de mayúsculas y minúsculas y los acentos.

De forma predeterminada, MongoDB ordena las cadenas mediante intercalación binaria. Esta intercalación predeterminada utiliza los valores de caracteres del estándar ASCII para comparar y ordenar las cadenas. Cada idioma y configuración regional tiene convenciones específicas de ordenación de caracteres que difieren del estándar ASCII, y puede optar por aplicar un conjunto diferente de reglas de intercalación a su operación.

Puede especificar una intercalación en los siguientes niveles:

  • Colección: Establece la intercalación predeterminada para las operaciones en la colección. No se puede definir una intercalación para una colección existente.

  • Índice: establece la intercalación para las operaciones que utilizan el índice.

  • Operación: establece la intercalación de la operación y anula cualquier intercalación heredada.

Para especificar una intercalación, cree un objeto Collation. Debe 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 configuración regional "en_US":

myCollation := &options.Collation{Locale: "en_US"}

Para obtener una lista completa de los campos Collation de objeto, visite la documentación de la API de intercalación. Para ver todas las configuraciones regionales compatibles y los valores predeterminados de los Locale campos, visite Idiomas y configuraciones regionales compatibles.

Puedes aplicar una intercalación al crear una nueva colección o vista. Esto define la intercalación predeterminada para cualquier operación realizada en esa colección o vista. Establece una intercalación mediante un objeto CreateCollectionOptions o CreateViewOptions. A continuación, llama al método CreateCollection() o CreateView() con el 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 llama a una operación que utiliza una intercalación en la books colección, la operación utiliza la intercalación predeterminada especificada en el Ejemplo de creación de una colección.

Supongamos 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 Find() método, consulte Buscar documentos.

Puedes aplicar una intercalación al crear un nuevo índice en una colección. El índice almacena una representación ordenada de los documentos de la colección, por lo que tu instancia de MongoDB no realiza la ordenación de las operaciones de ordenación en memoria.

Para usar el índice en una operación, esta debe usar la misma intercalación que la especificada en el índice. Además, asegúrese de que la operación esté cubierta por el índice que contiene la intercalación. Establezca una intercalación mediante un objeto IndexOptions y páselo 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 configuración regional "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 aplica una nueva intercalación a una operación que difiere de la intercalación de un índice, no podrá usar ese índice. Como resultado, la operación podría no funcionar tan bien como una que esté cubierta por un índice. Para obtener más información sobre las desventajas de las operaciones de ordenación no cubiertas por un índice, consulte "Usar índices para ordenar los resultados de consultas". Consulte el manual de MongoDB para obtener una lista de las operaciones que admiten la intercalación.

Puede utilizar operaciones que admitan la intercalación para actualizar y consultar 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 establecido en true, la misma operación Find() compara los valores length como cadenas. En este caso, el resultado es similar al 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 Find() método, consulte 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 analizados en esta guía, consulte la siguiente documentación de API:

Volver

Operaciones compuestas