Overview
En esta guía, puedes aprender cómo configurar operaciones de lectura y escritura en PyMongo.
Ajustes de lectura y guardar
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).
Por defecto, las bases de datos heredan estos ajustes de la MongoClient la instancia y las colecciones las heredan de la base de datos. Sin embargo, puedes cambiar estos ajustes en tu base de datos o colección utilizando uno de los siguientes métodos:
get_database(): Obtiene la base de datos y aplica la preferencia de lectura del cliente, el nivel de consistencia de lectura y la preferencia de escritura.database.with_options(): Obtiene la base de datos y aplica su preferencia de lectura actual, nivel de consistencia de lectura y preferencia de escritura.get_collection(): Obtiene la colección y aplica su preferencia de lectura actual, nivel de consistencia de lectura y preferencia de escritura.collection.with_options()Obtiene la colección y aplica la preferencia de lectura, el nivel de consistencia de lectura y la preferencia de escritura de la base de datos.
Para cambiar la configuración de lectura o escritura con los métodos anteriores, llama al método e introduce el nombre de la colección o de la base de datos y la nueva preferencia de lectura, nivel de consistencia de lectura o preferencia de escritura.
El siguiente ejemplo muestra cómo cambiar la preferencia de lectura, el nivel de consistencia de lectura y la preferencia de escritura de una base de datos llamada test-database con el método get_database():
client.get_database("test-database", read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
El siguiente ejemplo muestra cómo cambiar la configuración de lectura y guardado de una colección llamada test-collection con el método get_collection():
database.get_collection("test-collection", read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
El siguiente ejemplo muestra cómo cambiar la configuración de lectura y guardado de una colección llamada test-collection con el método with_options():
collection.with_options(read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
Tip
Para ver los tipos de preferencias de lectura disponibles en el número ReadPreference, consulta el
Documentación de la API.
Para obtener más información sobre la configuración de lectura y escritura, consulta las siguientes guías en el manual del servidor MongoDB:
Conjuntos de etiquetas
En MongoDB Server, puedes aplicar etiquetas de clave-valor a los miembros de un 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, PyMongo ignora las etiquetas al elegir un nodo del que leer. Para indicar a PyMongo que prefiera ciertas etiquetas, páselos como un parámetro al constructor de clase de preferencia de lectura.
En el siguiente ejemplo de código, el conjunto de etiquetas pasado al parámetro read_preference le indica a PyMongo que prefiera leer desde el centro de datos de Nueva York ('dc': 'ny') y que recurra al centro de datos de San Francisco ('dc': 'sf'):
db = client.get_database( 'test', read_preference=Secondary([{'dc': 'ny'}, {'dc': 'sf'}]))
Umbral local
Si varios miembros del set de réplicas coinciden con la preferencia de lectura y los conjuntos de etiquetas que especificas, PyMongo lee desde los miembros del set de réplicas más cercanos, elegidos según su tiempo de ping.
Por defecto, el driver utiliza solo aquellos nodos cuyos tiempos de ping están dentro de 15 milisegundos del nodo más cercano para las queries. Para distribuir las lecturas entre miembros con mayor latencia, pase la opción localThresholdMS al constructor MongoClient().
El siguiente ejemplo especifica un umbral local de 35 milisegundos. Selecciona el Synchronous o la pestaña Asynchronous para ver el código correspondiente:
client = MongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
client = AsyncMongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
En el ejemplo anterior, PyMongo distribuye las lecturas entre los nodos coincidentes dentro de 35 milisegundos del tiempo de ping del nodo más cercano.
Nota
PyMongo ignora el valor de localThresholdMS al comunicarse con un set de réplicas a través de una instancia mongos. En este caso, utiliza la opción de línea de comandos localThreshold.
Lecturas y Guardados Reintentarles
PyMongo reintenta automáticamente ciertas operaciones de lectura y escritura una sola vez si fallan debido a un error de red o del servidor.
Puedes desactivar explícitamente lecturas reintentarles (retryable) o escrituras reintentarles configurando la opción retryReads o retryWrites en False en el constructor MongoClient(). El siguiente ejemplo deshabilita las lecturas y escrituras reintentables para un cliente. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
client = MongoClient("<connection string>", retryReads=False, retryWrites=False)
client = AsyncMongoClient("<connection string>", retryReads=False, retryWrites=False)
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.
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 PyMongo, el controlador síncrono de Python para MongoDB, a la versión 4.17 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.
Intercalación
Cuando creas una colección, puedes especificar una intercalación por defecto para todas las operaciones que realices en la 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, crear una instancia de la clase Collation o un diccionario de Python. Para una lista de opciones que pueda pasar al constructor Collation o incluir como claves en el diccionario, consultar Intercalación en el manual de MongoDB Server.
Tip
Intercalación de importación
Para crear una instancia de la clase Collation, se debe importar desde pymongo.collation.
El siguiente ejemplo crea la misma colección que el ejemplo anterior, pero con una intercalación por defecto de fr_CA. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:
from pymongo.collation import Collation database = client["test_database"] database.create_collection("example_collection", collation=Collation(locale='fr_CA'))
from pymongo.collation import Collation database = client["test_database"] await database.create_collection("example_collection", collation=Collation(locale='fr_CA'))