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, puede aprender a configurar las opciones de nivel de confirmación de escritura (write concern), nivel de consistencia de lectura y preferencia de lectura para modificar la forma en que el controlador de C++ ejecuta las operaciones de lectura y escritura en los conjuntos 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:

  • transacción

  • Database

  • Colección

Esta lista también indica el orden creciente de prioridad de las configuraciones de opciones. Por ejemplo, si configuras un nivel de consistencia de lectura para una base de datos, esta sobrescribirá las configuraciones de nivel de consistencia de lectura heredadas de la transacción.

Puedes controlar cómo el driver direcciona las operaciones de lectura configurando una preferencia de lectura. También puede controlar las opciones de cómo el driver espera la confirmación de las operaciones de lectura y escritura en un set de réplicas configurando un nivel de consistencia de lectura y un nivel de confirmación de escritura (write concern).

Para obtener más información sobre la configuración de lectura y escritura y sus opciones, consulte las siguientes guías en el manual del MongoDB Server:

  • preferencia de lectura

  • readConcern

  • Nivel de confirmación de escritura

Para información sobre la configuración por defecto de nivel de consistencia de lectura y nivel de confirmación de escritura, consulta Nivel de consistencia de lectura/nivel de confirmación de escritura de MongoDB en el manual del MongoDB Server.

Las transacciones se ejecutan dentro de sesiones, que son agrupaciones de operaciones de lectura o escritura relacionadas que se pretende ejecutar de forma secuencial. Utilice el start_session() método para obtener una sesión para usar en las transacciones. Luego, pasa un objeto mongocxx::options::transaction al método with_transaction() de la sesión. Este ejemplo muestra cómo establecer la preferencia de lectura, el nivel de consistencia de lectura y el nivel de confirmación de escritura (write concern) de una transacción.

Tip

Para obtener más información sobre las sesiones, consulte Sesiones del Servidor en el manual del MongoDB Server.

El ejemplo configura los siguientes ajustes:

  • k_primary preferencia de lectura: Las operaciones de lectura recuperan los datos del miembro primario del set de réplicas.

  • k_majority nivel de consistencia de lectura: Las operaciones de lectura devuelven los datos más recientes de la instancia que se han escrito en la mayoría de los miembros del set de réplicas.

  • k_acknowledged nivel de confirmación de escritura (write concern): El miembro primario del conjunto de réplicas debe acuse de recibo de la operación de escritura.

auto session = client.start_session();
mongocxx::options::transaction txn_opts;
{
mongocxx::read_preference rp;
mongocxx::read_concern rc;
mongocxx::write_concern wc;
rp.mode(mongocxx::read_preference::read_mode::k_primary);
rc.acknowledge_level(mongocxx::read_concern::level::k_majority);
wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged);
txn_opts.read_preference(rp);
txn_opts.read_concern(rc);
txn_opts.write_concern(wc);
}
session.with_transaction([&](mongocxx::client_session*) {
// Specify transaction operations here
}, txn_opts);

Este ejemplo muestra cómo configurar los siguientes ajustes de lectura para tu base de datos:

  • k_secondary preferencia de lectura: Las operaciones de lectura recuperan datos solo de los miembros secundarios del set de réplicas.

  • k_majority nivel de consistencia de lectura: Las operaciones de lectura devuelven los datos más recientes de la instancia que se han escrito en la mayoría de los miembros del set de réplicas.

auto db = client["test_database"];
mongocxx::read_preference rp;
mongocxx::read_concern rc;
rp.mode(mongocxx::read_preference::read_mode::k_secondary);
rc.acknowledge_level(mongocxx::read_concern::level::k_majority);
db.read_preference(rp);
db.read_concern(rc);

Este ejemplo muestra cómo especificar los siguientes ajustes de nivel de confirmación de escritura (write concern) y lectura para tu colección:

  • k_local nivel de consistencia de lectura: las operaciones de lectura devuelven los datos más recientes 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.

  • k_acknowledged nivel de confirmación de escritura (write concern): El miembro primario del conjunto de réplicas debe acuse de recibo de la operación de escritura.

auto coll = client["test_database"]["test_collection"];
mongocxx::read_concern rc;
mongocxx::write_concern wc;
rc.acknowledge_level(mongocxx::read_concern::level::k_local);
wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged);
coll.read_concern(rc);
coll.write_concern(wc);

En el MongoDB Server, puedes aplicar etiquetas clave-valor a los miembros del conjunto de réplicas según los criterios que elijas. Luego, puede usar esas etiquetas para dirigir una operación de lectura a uno o más nodos.

Por defecto, el driver de C++ ignora las etiquetas al elegir el nodo desde el cual leer. Para indicar al controlador de C++ que prefiera ciertas etiquetas, crea un objeto mongocxx::read_preference y llama a su función de nodo tags(). Pasa tus etiquetas preferidas como argumento de arreglo a tags().

En el siguiente ejemplo de código, el conjunto de etiquetas pasado a la función tags() instruye al driver de C++ para que prefiera las lecturas desde el centro de datos de Nueva York ("dc": "ny") y que, en caso de no estar disponible, recurra al centro de datos de San Francisco ("dc": "sf"):

auto tag_set_ny = make_document(kvp("dc", "ny"));
auto tag_set_sf = make_document(kvp("dc", "sf"));
mongocxx::read_preference rp;
rp.mode(mongocxx::read_preference::read_mode::k_secondary);
rp.tags(make_array(tag_set_ny, tag_set_sf).view());

El controlador de C++ vuelve a intentar automáticamente ciertas operaciones de lectura y escritura una vez si fallan debido a un error de red o de servidor.

Puedes desactivar explícitamente las lecturas reintentables o la escritura reintentable configurando las opciones retryReads o retryWrites en false en tu URI de conexión. El siguiente ejemplo desactiva las lecturas y escrituras reintentables para un cliente:

mongocxx::uri uri{"mongodb://localhost:27017/?retryReads=false&retryWrites=false"};
mongocxx::client client{uri};

Para aprender más sobre las operaciones de lectura y escritura con reintentos admitidas, revisa las siguientes guías en el manual de MongoDB Server:

Nota

Limitación de velocidad adaptativa

Si los errores con etiquetas SystemOverloadedError o RetryableError provocan fallos en su aplicación o aparecen en los registros de la misma, es posible que su controlador no esté actualizado a una versión compatible con la limitación de velocidad adaptativa. Le recomendamos actualizar su controlador MongoDB C++ a la versión 4.3 o posterior. Si estos errores persisten tras la actualización, puede solucionarlos mediante cambios en el servidor, como revisar la configuración de Intelligent Workload Management (IWM), o mediante cambios en la aplicación, como implementar un manejo de errores personalizado o limitar las solicitudes del cliente. Según su situación, los cambios en la aplicación pueden ser preferibles o necesarios.

La limitación de velocidad adaptativa ayuda a gestionar la carga del servidor ajustando dinámicamente la frecuencia de las solicitudes en función de las condiciones actuales. Esta función está disponible en MongoDB 8.3 y versiones posteriores.

Para obtener más información sobre IWM, consulte la página de Fiabilidad, Disponibilidad y Gestión de Carga de Trabajo o la página de Errores de Sobrecarga en la documentación de Atlas.

Al conectarse a un clúster o a un set de réplicas, el driver C++ utiliza el balanceo de carga para gestionar las solicitudes de lectura y escritura. El balanceo de carga permite que el controlador distribuya estas solicitudes entre varios servidores, lo que evita sobrecargar cualquier servidor y garantiza un rendimiento óptimo.

Al conectarse a un clúster particionado, el controlador de C++ determina la instancia más cercana de mongos calculando cuál tiene el menor tiempo de ida y vuelta en la red. Luego, el driver determina la ventana de latencia sumando el tiempo de ida y vuelta promedio de este mongos al valor localThresholdMS. El controlador equilibra la carga de las solicitudes entre hasta dos instancias aleatorias de mongos que están dentro de la ventana de latencia. Para cada solicitud, el controlador elige el servidor con la menor carga de operación determinando su valor operationCount.

Al conectarse a un set de réplicas, el driver C++ primero selecciona los miembros del set de réplicas según su preferencia de lectura. Luego, el driver sigue el mismo proceso que se describió en el párrafo anterior. Tras calcular la ventana de latencia, el controlador selecciona hasta dos miembros del set de réplicas aleatorias que caen dentro de la ventana y elige el nodo con el menor valor de operationCount para recibir la solicitud.

Tip

Para obtener más información sobre el balanceo de carga, consulte Balanceador de clúster en el manual de MongoDB Server.

El controlador de C++ usa el valor de umbral local para calcular la ventana de latencia para la selección del servidor. Este valor determina los servidores que son elegibles para recibir solicitudes de lectura y guardado.

De forma predeterminada, el driver utiliza únicamente mongos instancias o miembros del set de réplicas cuyos tiempos de ping están dentro de 15 milisegundos del servidor más cercano. Para distribuir lecturas entre servidores con latencias más altas, establece el parámetro localThreshold en tu URI de conexión.

Nota

Al seleccionar los miembros del set de réplicas desde una sola instancia de mongos, el controlador C++ ignora la opción localThresholdMS. En este caso, utiliza la opción de línea de comandos localThreshold.

El siguiente ejemplo se conecta a un set de réplicas y especifica un umbral local de 35 milisegundos:

mongocxx::uri uri{"mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"};
mongocxx::client client{uri};

En el ejemplo anterior, el driver de C++ distribuye las lecturas entre los nodos que coinciden dentro de 35 milisegundos del tiempo de ping del nodo más cercano.

Puede especificar una intercalación cuando realiza operaciones de lectura y escritura en una colección.

Una intercalación es un conjunto de reglas específicas del lenguaje para la comparación de strings, como el uso de mayúsculas y minúsculas y las marcas de acento.

Para especificar una intercalación, pase la definición de intercalación al método collation() de un objeto de opciones y, a continuación, pase este objeto de opciones a una operación de lectura o guardado.

Considera una colección con los siguientes documentos:

{ _id: 1, category: "café" },
{ _id: 2, category: "cafe" },
{ _id: 3, category: "cafE" }

El siguiente ejemplo crea una intercalación que especifica la localización francesa e ignora las diferencias entre variantes de mayúsculas, minúsculas y letras. Luego utiliza esta intercalación para encontrar documentos en los que el valor del campo category coincide con "cafe". Debido a la intercalación especificada, la query devuelve los tres documentos.

mongocxx::options::find opts{};
opts.collation(bsoncxx::from_json(R"({"locale": "fr", "strength": 1})"));
auto cursor = collection.find(make_document(kvp("category", "cafe")), opts);
for(auto&& doc : cursor) {
std::cout << bsoncxx::to_json(doc) << std::endl;
}
{ "_id": { "$oid" : "1" }, "category": "café" }
{ "_id": { "$oid" : "2" }, "category": "cafe" }
{ "_id": { "$oid" : "3" }, "category": "cafE" }

Para obtener más información sobre cualquiera de las clases o métodos tratados en esta guía, consulta la siguiente documentación de la API:

Volver

Seguridad de hilos y bifurcaciones

En esta página