Visão geral
Neste guia, você pode aprender como configurar operações de leitura e escrita no PyMongo.
Configurações de leitura e escrita
Você pode controlar como o driver direciona as operações de leitura definindo uma read preference. Você também pode controlar as opções de como o driver aguarda a confirmação das operações de leitura e gravação em um conjunto de réplicas, definindo uma read concern e uma write concern.
Por padrão, os bancos de dados herdam essas configurações da instância MongoClient e as collections as herdam do banco de dados. No entanto, você pode alterar essas configurações em seu banco de dados ou coleção usando um dos seguintes métodos:
get_database(): obtém o banco de dados e aplica a preferência de leitura, a preocupação de leitura e a preferência de gravação do cliente.database.with_options(): Obtém o banco de dados e aplica sua preferência de leitura, preocupação de leitura e preferência de gravação atuais.get_collection(): Obtém a coleção e aplica sua preferência de leitura, preocupação de leitura e preferência de gravação atuais.collection.with_options(): Obtém a coleção e aplica a preferência de leitura, preocupação de leitura e preferência de gravação do banco de dados.
Para alterar as configurações de leitura ou gravação com os métodos anteriores, chame o método e passe o nome da coleção ou do banco de dados e a nova preferência de leitura, preocupação de leitura ou preferência de gravação.
O exemplo a seguir mostra como alterar a read preference, read concern e write preference de um banco de dados chamado test-database com o método get_database() :
client.get_database("test-database", read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
O exemplo seguinte mostra como alterar as configurações de leitura e escrita de uma coleção chamada test-collection com o método get_collection() :
database.get_collection("test-collection", read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
O exemplo seguinte mostra como alterar as configurações de leitura e escrita de uma coleção chamada test-collection com o método with_options() :
collection.with_options(read_preference=ReadPreference.SECONDARY, read_concern="local", write_concern="majority")
Dica
Para ver os tipos de preferências de leitura disponíveis no enumeração ReadPreference, consulte a documentação da API.
Para saber mais sobre as configurações de leitura e gravação, consulte os seguintes guias no manual do MongoDB Server :
Conjuntos de tags
No MongoDB Server, você pode aplicar marcações de valor-chave a membros do conjunto de réplicas de acordo com qualquer critério de sua escolha. Você pode então usar essas tags para direcionar um ou mais nós para uma operação de leitura.
Por padrão, o PyMongo ignora as tags ao escolher um membro para ler. Para instruir o PyMongo a preferir determinadas tags, passe-as como parâmetro para seu construtor de classe de preferência de leitura.
No exemplo de código a seguir, o conjunto de tags passado para o parâmetro read_preference instrui o PyMongo a preferir leituras do centro de dados de Nova York ('dc': 'ny') e a voltar para o centro de dados de São Francisco ('dc': 'sf'):
db = client.get_database( 'test', read_preference=Secondary([{'dc': 'ny'}, {'dc': 'sf'}]))
LocalThreshold
Ao conectar-se a um conjunto de réplicas com uma preferência de leitura não primária, o driver lê do nó de conjunto de réplicas elegível mais próximo dentro da janela de latência. Ao conectar-se a um cluster sharded, o driver seleciona todas as instâncias mongos acessíveis dentro da janela de latência. Para saber mais sobre os modos de preferência de leitura, consulte Preferência de leitura.
Por padrão, o driver usa apenas os servidores cujos tempos de ping estão dentro de 15 milissegundos do servidor elegível mais próximo.
Por exemplo, suponha que seu conjunto de réplicas tenha cinco nós e o nó mais próximo tenha um tempo de ping de 5 milissegundos. Com o localThresholdMS padrão de 15 milissegundos, apenas nós com um tempo de ping de 20 milissegundos ou menos estão dentro da janela de latência, conforme mostrado na tabela a seguir:
Anfitrião | Tipo | Tempo de ping | Dentro da janela de latência |
|---|---|---|---|
| Principal | 5ms | Sim |
| secundário | 9ms | Sim |
| secundário | 13ms | Sim |
| secundário | 24ms | No |
| secundário | 42ms | No |
Para ajustar a janela de latência, passe a opção localThresholdMS para o construtor MongoClient().
O exemplo a seguir especifica um limite local de 35 milissegundos. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
client = MongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
client = AsyncMongoClient(replicaSet='repl0', readPreference=ReadPreference.SECONDARY_PREFERRED, localThresholdMS=35)
No exemplo anterior, o PyMongo distribui leituras entre nós correspondentes dentro de 35 milissegundos do tempo de ping do nó mais próximo.
Observação
O PyMongo ignora o valor de localThresholdMS ao se comunicar com um conjunto de réplicas por meio de uma instância mongos . Nesse caso, use a opção de linha de comando localThreshold .
Leituras e gravações retráteis
O PyMongo tenta automaticamente determinadas operações de leitura e gravação uma única vez se elas falharem devido a um erro de rede ou servidor .
Você pode desabilitar explicitamente as leituras ou gravações repetíveis definindo a opção retryReads ou retryWrites como False no construtor MongoClient() . O exemplo a seguir desativa leituras e gravações repetíveis para um cliente. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
client = MongoClient("<connection string>", retryReads=False, retryWrites=False)
client = AsyncMongoClient("<connection string>", retryReads=False, retryWrites=False)
Para saber mais sobre as operações de leitura repetível com suporte, consulte Leituras repetíveis no manual do MongoDB Server . Para saber mais sobre as operações de gravações repetíveis com suporte, consulte Retryable writes no manual do MongoDB Server .
Opções de nova tentativa
Você pode configurar como o PyMongo lida com operações quando um servidor retorna um erro de sobrecarga usando as seguintes opções do cliente :
enable_overload_retargeting: especifica se o driver desprioriza um servidor que retorna um erro de sobrecarga, reduzindo a probabilidade de tentar novamente no mesmo servidor sobrecarregado. O valor padrão éFalse.max_adaptive_retries: especifica o número máximo de vezes que o driver tenta novamente uma operação quando um servidor retorna um erro de sobrecarga. O valor padrão é2.
O exemplo a seguir cria um MongoClient e configura as opções de nova tentativa de sobrecarga. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
client = MongoClient("<connection string>", enable_overload_retargeting=True, max_adaptive_retries=3)
client = AsyncMongoClient("<connection string>", enable_overload_retargeting=True, max_adaptive_retries=3)
Agrupamentos
Ao criar uma coleção, você pode especificar um agrupamento padrão para todas as operações executadas na coleção.
Um agrupamento é um conjunto de regras específicas do idioma para comparação de cadeias de caracteres, como para letras maiúsculas e minúsculas e acentos.
Para especificar um agrupamento, crie uma instância da classe Collation ou um dicionário Python. Para obter uma lista de opções a serem passadas para o construtor Collation ou incluídas como chaves no dicionário, consulte Agrupamento no manual do MongoDB Server.
Dica
Importar agrupamento
Para criar uma instância da classe Collation, você deve importá-la do pymongo.collation.
O exemplo a seguir cria a mesma coleção do exemplo anterior, mas com um agrupamento padrão de fr_CA. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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'))