Docs Menu
Docs Home
/ /

Configurar las operaciones CRUD

En esta guía, puede aprender cómo configurar las opciones de preocupaciónde escritura,preocupación de lectura y preferencia de lectura para modificar la forma en que el controlador de C++ ejecuta operaciones de lectura y escritura en conjuntos de réplicas.

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

  • Transacción

  • Database

  • Colección

Esta lista también indica el orden de precedencia creciente de la configuración de las opciones. Por ejemplo, si se configura una solicitud de lectura para una base de datos, esta anulará la configuración de la solicitud de lectura heredada de la transacción.

Puede controlar cómo el controlador enruta las operaciones de lectura configurando una preferencia de lectura. También puede controlar cómo el controlador espera la confirmación de las operaciones de lectura y escritura en un conjunto de réplicas configurando una preocupación de lectura y una preocupación de escritura.

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

  • preferencia de lectura

  • readConcern

  • Nivel de confirmación de escritura

Para obtener información sobre la configuración de lectura y escritura predeterminada, consulte Preocupaciones de lectura/escritura predeterminadas de MongoDB en el manual del servidor MongoDB.

Las transacciones se ejecutan dentro de sesiones, que son agrupaciones de operaciones de lectura o escritura relacionadas que se pretenden ejecutar secuencialmente. Utilice el start_session() Método para obtener una sesión que se usará para las transacciones. Luego, pase un objeto mongocxx::options::transaction al método with_transaction() de la sesión. Este ejemplo muestra cómo establecer la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de una transacción.

Tip

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

El ejemplo configura los siguientes ajustes:

  • k_primary preferencia de lectura: las operaciones de lectura recuperan datos del miembro del conjunto de réplicas principal.

  • k_majority preocupación 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 conjunto de réplicas.

  • k_acknowledged Preocupación de escritura: el miembro principal del conjunto de réplicas debe reconocer 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 su base de datos:

  • k_secondary Preferencia de lectura: las operaciones de lectura recuperan datos únicamente de los miembros del conjunto de réplicas secundarias.

  • k_majority preocupación 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 conjunto 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 las siguientes configuraciones de lectura y escritura para su colección:

  • k_local Preocupación de lectura: las operaciones de lectura devuelven 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.

  • k_acknowledged Preocupación de escritura: el miembro principal del conjunto de réplicas debe reconocer 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 MongoDB Server, puede aplicar etiquetas clave-valor a los miembros del conjunto de réplicas según el criterio que elija. Después, puede usar esas etiquetas para seleccionar uno o más miembros para una operación de lectura.

De forma predeterminada, el controlador de C++ ignora las etiquetas al elegir un miembro para leer. Para indicarle que prefiera ciertas etiquetas, cree un objeto mongocxx::read_preference y llame a su función miembro tags(). Pase las etiquetas que prefiera como argumento de matriz a tags().

En el siguiente ejemplo de código, el conjunto de etiquetas pasado a la función tags() le indica al controlador de C++ que prefiera las lecturas del centro de datos de Nueva York ("dc": "ny") y 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 C++ vuelve a intentar automáticamente ciertas operaciones de lectura y escritura una vez si fallan debido a un error de red o servidor.

Puede deshabilitar explícitamente las lecturas o escrituras reintentables configurando las opciones retryReads o retryWrites en false en la URI de su conexión. El siguiente ejemplo deshabilita las lecturas y escrituras reintentables para un cliente:

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

Para obtener más información sobre las operaciones de lectura y escritura reintentables admitidas, consulte las siguientes guías en el manual de MongoDB Server:

Al conectarse a un clúster fragmentado o a un conjunto de réplicas, el controlador de C++ utiliza el equilibrio de carga para gestionar las solicitudes de lectura y escritura. El equilibrio de carga permite al controlador distribuir estas solicitudes entre varios servidores, lo que evita la sobrecarga de un servidor y garantiza un rendimiento óptimo.

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

Al conectarse a un conjunto de réplicas, el controlador de C++ selecciona primero los miembros del conjunto según sus preferencias de lectura. A continuación, sigue el mismo proceso descrito en el párrafo anterior. Tras calcular la ventana de latencia, selecciona hasta dos miembros aleatorios del conjunto de réplicas que se encuentren dentro de la ventana y elige el miembro con el valor operationCount más bajo para recibir la solicitud.

Tip

Para obtener más información sobre el equilibrio de carga, consulte Sharded Cluster Balancer en el manual de MongoDB Server.

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

De forma predeterminada, el controlador solo utiliza instancias mongos o miembros del conjunto de réplicas cuyos tiempos de ping están a menos de 15 milisegundos del servidor más cercano. Para distribuir las lecturas entre servidores con latencias más altas, configure el parámetro localThreshold en la URI de su conexión.

Nota

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

El siguiente ejemplo se conecta a un conjunto 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 controlador C++ distribuye lecturas entre los miembros coincidentes dentro de 35 milisegundos del tiempo de ping del miembro 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, luego pase este objeto de opciones a una operación de lectura o escritura.

Consideremos 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 configuración regional francesa e ignora las diferencias entre mayúsculas y minúsculas. Utiliza esta intercalación para buscar documentos en los que el valor del campo category coincida con "cafe". Gracias a la intercalación especificada, la consulta 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