Overview
En esta guía, puede aprender a utilizar el controlador Node.js para configurar operaciones de lectura y escritura.
Configuración 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:
Cliente, que establece el valor predeterminado para todas las ejecuciones de operaciones a menos que se anule
Transacción
Database
Colección
La lista anterior también indica el orden de prioridad creciente de la configuración de las opciones. Por ejemplo, si se establece un nivel de lectura para una transacción, este anulará el nivel de lectura establecido para el cliente.
Tip
Para obtener más información sobre la configuración de lectura y escritura, consulte las siguientes guías en el manual de MongoDB Server:
Esta sección muestra cómo configurar los ajustes de lectura y escritura en cada nivel.
Configuración del cliente
Este ejemplo muestra cómo establecer la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de un MongoClient instancia pasando un objeto MongoClientOptions al constructor. El código configura los siguientes ajustes:
SECONDARYPreferencia de lectura: las operaciones de lectura recuperan datos de los miembros del conjunto de réplicas secundariaslocalPreocupación de lectura: las operaciones de lectura devuelven los datos más recientes de la instancia sin garantizar que los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicas2Preocupación de escritura: el miembro principal y uno secundario del conjunto de réplicas deben confirmar la operación de escritura
const clientOptions = { readPreference: ReadPreference.SECONDARY, readConcern: { level: "local" }, writeConcern: { w: 2 }, }; const client = new MongoClient("mongodb://localhost:27017", clientOptions);
Alternativamente, se pueden especificar los ajustes de lectura y guardado en el URI de conexión, que se pasa como un parámetro al constructor MongoClient:
const uri = "mongodb://localhost:27017/?readPreference=secondary&readConcernLevel=local&w=2"; const clientWithUri = new MongoClient(uri);
Configuración de transacciones
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 pasando un objeto TransactionOptions al método startTransaction(). El código configura los siguientes ajustes:
PRIMARYPreferencia de lectura: las operaciones de lectura recuperan datos del miembro del conjunto de réplicas principalmajorityPreocupació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éplicas1Preocupación de escritura: el miembro principal del conjunto de réplicas debe reconocer la operación de escritura
const transactionOptions = { readPreference: ReadPreference.PRIMARY, readConcern: { level: "majority" }, writeConcern: { w: 1 }, }; const session = client.startSession(); session.startTransaction(transactionOptions);
Configuración de la base de datos
Este ejemplo muestra cómo establecer la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de una base de datos llamada test_database pasando un objeto DbOptions al método db(). El código configura los siguientes ajustes:
PRIMARY_PREFERREDpreferencia de lectura: Las operaciones de lectura recuperan datos desde el miembro principal del set de réplicas, o desde miembros secundarios si el principal no está disponible.availablePreocupación de lectura: las operaciones de lectura devuelven los datos más recientes de la instancia sin garantizar que los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicasmajorityPreocupación de escritura: la mayoría de los miembros del conjunto de réplicas deben reconocer la operación de escritura
const dbOptions = { readPreference: ReadPreference.PRIMARY_PREFERRED, readConcern: { level: "available" }, writeConcern: { w: "majority" }, }; const db = client.db("test_database", dbOptions);
Configuración de la colección
Este ejemplo muestra cómo establecer la preferencia de lectura, la preocupación de lectura y la preocupación de escritura de una colección llamada test_collection pasando un objeto CollectionOptions al método collection(). El código configura los siguientes ajustes:
SECONDARY_PREFERREDPreferencia de lectura: Las operaciones de lectura recuperan datos de los miembros del conjunto de réplicas secundarias o de los miembros primarios si no hay secundarios disponiblesavailablePreocupación de lectura: las operaciones de lectura devuelven los datos más recientes de la instancia sin garantizar que los datos se hayan escrito en la mayoría de los miembros del conjunto de réplicas0Preocupación de escritura: no solicita reconocimiento de la operación de escritura
const collOptions = { readPreference: ReadPreference.SECONDARY_PREFERRED, readConcern: { level: "available" }, writeConcern: { w: 0 }, }; const collection = db.collection("test_collection", collOptions);
Conjuntos de etiquetas
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 Node.js ignora las etiquetas al elegir un miembro para leer. Para indicarle que prefiera ciertas etiquetas, páselas como parámetro al constructor de la clase de preferencia de lectura.
Este ejemplo de código establece la opción readPreference en un conjunto de etiquetas que le indica a test_database que prefiera las lecturas de los miembros del conjunto de réplicas secundarias en el siguiente orden:
Miembros del centro de datos de Nueva York (
{ dc: 'ny' })Miembros del centro de datos de San Francisco (
{ dc: 'sf' })Cualquier miembro secundario (
{})
const taggedReadPreference = new ReadPreference( ReadPreference.SECONDARY, [ { dc: "ny" }, { dc: "sf" }, {} ] ); const dbWithTags = client.db( "test_database", { readPreference: taggedReadPreference } );
Umbral local
Si varios miembros del conjunto de réplicas coinciden con la preferencia de lectura y los conjuntos de etiquetas que especifique, el controlador Node.js lee desde los miembros del conjunto de réplicas más cercanos, elegidos de acuerdo con su tiempo de ping.
De forma predeterminada, el controlador utiliza solo los miembros cuyos tiempos de ping están a menos de 15 milisegundos del miembro más cercano para las consultas. Para distribuir las lecturas entre los miembros con latencias más altas, pase la opción localThresholdMS al constructor MongoClient().
El siguiente ejemplo especifica un umbral local de 35 milisegundos:
const clientWithLocalThreshold = new MongoClient("mongodb://localhost:27017", { replicaSet: "repl0", readPreference: ReadPreference.SECONDARY_PREFERRED, localThresholdMS: 35 });
En el ejemplo anterior, el controlador Node.js distribuye lecturas entre los miembros coincidentes dentro de 35 milisegundos del tiempo de ping del miembro más cercano.
Nota
El controlador de Node.js ignora el valor localThresholdMS al comunicarse con un conjunto de réplicas a través de una mongos instancia. En este caso, utilice la opción de línea de comandos localThreshold.
Intercalación
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.
MongoDB ordena cadenas utilizando intercalación binaria de forma predeterminada. Esta intercalación por defecto utiliza los valores de caracteres estándar ASCII para comparar y ordenar cadenas. Los lenguajes y las localizaciones tienen convenciones específicas de ordenación de caracteres que difieren del estándar ASCII, y se puede optar por aplicar un conjunto diferente de reglas de intercalación a una 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.
Campos de intercalación
El objeto de intercalación contiene los siguientes campos:
collation: { locale: <string>, caseLevel: <bool>, caseFirst: <string>, strength: <int>, numericOrdering: <bool>, alternate: <string>, maxVariable: <string>, backwards: <bool> }
Al collation configurar la opción, debe especificar el locale campo. Los demás campos son opcionales. Para obtener una lista completa de las configuraciones regionales compatibles y los valores predeterminados de los locale campos, consulte la sección "Idiomas y configuraciones regionales compatibles" en el manual de MongoDB Server.
Ejemplos de intercalación
Para especificar una intercalación, cree un objeto collation y asigne a su campo locale la intercalación de idioma que desee usar. A continuación, pase este objeto como parámetro de opciones al método correspondiente al nivel de intercalación de destino.
Esta sección incluye ejemplos que establecen intercalaciones en los niveles de colección, índice y operación.
Colección de conjuntos y intercalaciones de índices
El siguiente ejemplo crea una nueva colección denominada names y establece su intercalación predeterminada en la configuración regional "fr_CA":
const db = client.db("db") db.createCollection("names", { collation: { locale: "fr_CA" }, });
Puede crear un índice en la colección names que especifique una intercalación diferente, como se muestra en el siguiente ejemplo:
const coll = db.collection("names"); coll.createIndex( { "last_name" : 1 }, { "collation" : { "locale" : "en_US" } });
Establecer una intercalación de operaciones
Puede ejecutar una operación en la names colección, creada en la sección anterior, que anule la intercalación predeterminada.
La colección names contiene los siguientes documentos:
{ "_id" : 1, "first_name" : "Hans", "last_name" : "Muller" } { "_id" : 2, "first_name" : "Gunter", "last_name" : "Braun" } { "_id" : 3, "first_name" : "Günter", "last_name" : "Krause" } { "_id" : 4, "first_name" : "Jürgen", "last_name" : "Weber" }
Este ejemplo llama al método findOneAndUpdate() para actualizar el primer documento coincidente cuyo valor first_name sea "Gunter". El código aplica una intercalación con la configuración regional "de" y su variante "phonebook":
coll.findOneAndUpdate( { first_name: { $lt: "Gunter" } }, { $set: { verified: true } }, { collation: { locale: "de@collation=phonebook" } }, );
En el ejemplo anterior, la variante de configuración regional phonebook indica al controlador que ordene los caracteres con diéresis antes que los mismos caracteres sin diéresis. Como resultado, la operación coincide con el documento cuyo valor first_name es "Günter", con diéresis, y devuelve la siguiente información de actualización:
{ lastErrorObject: { updatedExisting: true, n: 1 }, value: { _id: 3, first_name: 'Günter', last_name: 'Krause' }, ok: 1 }
Tip
Para obtener más información sobre las variantes locales, consulte Variantes locales en el manual de MongoDB Server.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: