Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Operações de gravação em massa

Neste guia, você verá como usar o PyMongo para executar operações em massa. As operações em massa reduzem o número de chamadas para o servidor , realizando várias operações de gravação em um único método.

As classes Collection e MongoClient fornecem um método bulk_write(). Ao chamar bulk_write() em uma instância do Collection, você pode executar múltiplas operações de gravação em uma única coleção. Ao chamar bulk_write() em uma instância do MongoClient, você pode realizar gravações em massa em vários namespaces. No MongoDB, um namespace consiste no nome do banco de dados e no nome da collection no formato <database>.<collection>.

Importante

Para executar operações em massa em uma instância do MongoClient, certifique-se de que seu aplicação atenda aos seguintes requisitos:

  • Usa o PyMongo v4.9 ou posterior

  • Conecta-se ao MongoDB Server v8.0 ou posterior

Os exemplos neste guia usam as collections sample_restaurants.restaurants e sample_mflix.movies dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de amostra, consulte o tutorial Introdução ao PyMongo.

Para cada operação de gravação que você deseja executar, crie uma instância de uma das seguintes classes de operação:

  • InsertOne

  • UpdateOne

  • UpdateMany

  • ReplaceOne

  • DeleteOne

  • DeleteMany

Em seguida, passe uma lista dessas instâncias para o método bulk_write() .

Importante

Certifique-se de importar as classes de operação de gravação para o arquivo do aplicação , conforme mostrado no código a seguir:

from pymongo import InsertOne, UpdateOne, UpdateMany, ReplaceOne, DeleteOne, DeleteMany

As seções a seguir mostram como criar instâncias das classes anteriores, que você pode usar para executar operações de collection e cliente em massa.

Para executar uma operação de inserção, crie uma instância de InsertOne e especifique o documento que você deseja inserir. Passe os seguintes argumentos de palavra-chave para o construtor InsertOne:

  • namespace: O namespace no qual inserir o documento. Este argumento é opcional se você executar a operação em massa em uma única coleção.

  • document: o documento a inserir.

O exemplo a seguir cria uma instância de InsertOne:

operation = InsertOne(
namespace="sample_restaurants.restaurants",
document={
"name": "Mongo's Deli",
"cuisine": "Sandwiches",
"borough": "Manhattan",
"restaurant_id": "1234"
}
)

Você também pode criar uma instância de InsertOne passando uma instância de uma classe personalizada para o construtor. Isso oferece segurança adicional de tipo se você estiver usando uma ferramenta de verificação de tipo. A instância pela qual você passa deve herdar da classe TypedDict.

Observação

TypedDict no Python 3.7 e anteriores

A classe TypedDict está no módulo typing, que está disponível somente no Python 3.8 e posterior. Para usar a classe TypedDict em versões anteriores do Python, instale o pacote digitando_extensões.

O exemplo a seguir constrói uma instância InsertOne usando uma classe personalizada para maior segurança de tipo:

class Restaurant (TypedDict):
name: str
cuisine: str
borough: str
restaurant_id: str
operation = pymongo.InsertOne(Restaurant(
name="Mongo's Deli", cuisine="Sandwiches", borough="Manhattan", restaurant_id="1234"))

Para inserir vários documentos, crie uma instância de InsertOne para cada documento.

Observação

O campo _id deve ser único

Em uma coleção MongoDB , cada documento deve conter um campo _id com um valor único.

Se você especificar um valor para o campo _id, você deverá garantir que o valor seja único na coleção. Se você não especificar um valor, o driver gerará automaticamente um valor ObjectId exclusivo para o campo.

Recomendamos deixar o driver gerar automaticamente valores de _id para garantir exclusividade. Os valores duplicados de _id violam restrições de índice único , o que faz com que o driver retorne um erro.

Para atualizar um documento, crie uma instância de UpdateOne e passe os seguintes argumentos:

  • namespace: O namespace no qual realizar a atualização. Este argumento é opcional se você executar a operação em massa em uma única coleção.

  • filter: o filtro de query que especifica os critérios utilizados para corresponder aos documentos em sua coleção.

  • update: A atualização que você deseja executar. Para obter mais informações sobre operações de atualização, consulte o guia Operadores de atualização de campo no manual do MongoDB Server.

UpdateOne atualiza o primeiro documento que corresponde ao seu filtro de query.

O exemplo a seguir cria uma instância de UpdateOne:

operation = UpdateOne(
namespace="sample_restaurants.restaurants",
filter={ "name": "Mongo's Deli" },
update={ "$set": { "cuisine": "Sandwiches and Salads" }}
)

Para atualizar vários documentos, crie uma instância de UpdateMany e passe os mesmos argumentos. UpdateMany atualiza todos os documentos que correspondem ao seu filtro de query.

O exemplo a seguir cria uma instância de UpdateMany:

operation = UpdateMany(
namespace="sample_restaurants.restaurants",
filter={ "name": "Mongo's Deli" },
update={ "$set": { "cuisine": "Sandwiches and Salads" }}
)

Uma operação de substituição remove todos os campos e valores de um documento especificado e os substitui por novos. Para executar uma operação de substituição, crie uma instância de ReplaceOne e passe os seguintes argumentos:

  • namespace: O namespace no qual executar a operação de substituição. Este argumento é opcional se você executar a operação em massa em uma única coleção.

  • filter: o filtro de query que especifica os critérios usados para corresponder ao documento a ser substituído.

  • replacement: O documento que inclui os novos campos e valores que você deseja armazenar no documento correspondente .

O exemplo a seguir cria uma instância de ReplaceOne:

operation = ReplaceOne(
namespace="sample_restaurants.restaurants",
filter={ "restaurant_id": "1234" },
replacement={
"name": "Mongo's Pizza",
"cuisine": "Pizza",
"borough": "Brooklyn",
"restaurant_id": "5678"
}
)

Você também pode criar uma instância de ReplaceOne passando uma instância de uma classe personalizada para o construtor. Isso oferece segurança adicional de tipo se você estiver usando uma ferramenta de verificação de tipo. A instância pela qual você passa deve herdar da classe TypedDict.

Observação

TypedDict no Python 3.7 e anteriores

A classe TypedDict está no módulo typing, que está disponível somente no Python 3.8 e posterior. Para usar a classe TypedDict em versões anteriores do Python, instale o pacote digitando_extensões.

O exemplo a seguir constrói uma instância ReplaceOne usando uma classe personalizada para maior segurança de tipo:

class Restaurant (TypedDict):
name: str
cuisine: str
borough: str
restaurant_id: str
operation = pymongo.ReplaceOne(
{ "restaurant_id": "1234" },
Restaurant(name="Mongo's Pizza", cuisine="Pizza", borough="Brooklyn", restaurant_id="5678")
)

Para substituir vários documentos, você deve criar uma instância de ReplaceOne para cada documento.

Dica

Ferramentas de verificação de tipo

Para saber mais sobre as ferramentas de verificação de tipo disponíveis para Python, consulte Verificadores de tipo na página Ferramentas.

Para excluir um documento, crie uma instância de DeleteOne e passe os seguintes argumentos:

  • namespace: O namespace no qual excluir o documento. Este argumento é opcional se você executar a operação em massa em uma única coleção.

  • filter: o filtro de query que especifica os critérios usados para corresponder ao documento a ser excluído.

DeleteOne remove apenas o primeiro documento que corresponde ao seu filtro de query.

O exemplo a seguir cria uma instância de DeleteOne:

operation = DeleteOne(
namespace="sample_restaurants.restaurants",
filter={ "restaurant_id": "5678" }
)

Para excluir vários documentos, crie uma instância do DeleteMany e passe um namespace e um filtro de query especificando o documento que você deseja excluir. DeleteMany remove todos os documentos que correspondem ao seu filtro de query.

O exemplo a seguir cria uma instância de DeleteMany:

operation = DeleteMany(
namespace="sample_restaurants.restaurants",
filter={ "name": "Mongo's Deli" }
)

Depois de definir uma instância de classe para cada operação que deseja executar, passe uma lista dessas instâncias para o método bulk_write(). Chame o método bulk_write() em uma instância Collection para escrever em uma única coleção ou uma instância MongoClient para escrever em vários namespaces.

Se qualquer uma das operações de gravação chamadas em um Collection falhar, o PyMongo gerará um BulkWriteError e não executará mais nenhuma operação. BulkWriteError fornece um atributo details que inclui a operação que falhou e detalhes sobre a exceção.

Se qualquer uma das operações de gravação chamadas em um MongoClient falhar, o PyMongo gerará um ClientBulkWriteException e não executará mais nenhuma operação. ClientBulkWriteException fornece um atributo error que inclui informações sobre a exceção.

Observação

Quando o PyMongo executa uma operação em massa, ele usa o write_concern da collection ou cliente no qual a operação está sendo executada. Você também pode definir uma preocupação de gravação para a operação ao usar o método MongoClient.bulk_write(). O driver relata todos os erros de preocupação de gravação depois de tentar todas as operações, independentemente da ordem de execução.

Para saber mais sobre write concerns, consulte Write Concern no manual do MongoDB Server.

O exemplo seguinte executa múltiplas operações de gravação na coleção restaurants utilizando o método bulk_write() em uma instância do Collection . Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:

operations = [
InsertOne(
document={
"name": "Mongo's Deli",
"cuisine": "Sandwiches",
"borough": "Manhattan",
"restaurant_id": "1234"
}
),
InsertOne(
document={
"name": "Mongo's Deli",
"cuisine": "Sandwiches",
"borough": "Brooklyn",
"restaurant_id": "5678"
}
),
UpdateMany(
filter={ "name": "Mongo's Deli" },
update={ "$set": { "cuisine": "Sandwiches and Salads" }}
),
DeleteOne(
filter={ "restaurant_id": "1234" }
)
]
results = restaurants.bulk_write(operations)
print(results)
BulkWriteResult({'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 2,
'nUpserted': 0, 'nMatched': 2, 'nModified': 2, 'nRemoved': 1, 'upserted': []},
acknowledged=True)
operations = [
InsertOne(
document={
"name": "Mongo's Deli",
"cuisine": "Sandwiches",
"borough": "Manhattan",
"restaurant_id": "1234"
}
),
InsertOne(
document={
"name": "Mongo's Deli",
"cuisine": "Sandwiches",
"borough": "Brooklyn",
"restaurant_id": "5678"
}
),
UpdateMany(
filter={ "name": "Mongo's Deli" },
update={ "$set": { "cuisine": "Sandwiches and Salads" }}
),
DeleteOne(
filter={ "restaurant_id": "1234" }
)
]
results = await restaurants.bulk_write(operations)
print(results)
BulkWriteResult({'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 2,
'nUpserted': 0, 'nMatched': 2, 'nModified': 2, 'nRemoved': 1, 'upserted': []},
acknowledged=True)

O exemplo seguinte executa múltiplas operações de gravação nos namespaces sample_restaurants.restaurants e sample_mflix.movies utilizando o método bulk_write() em uma instância do MongoClient. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:

operations = [
InsertOne(
namespace="sample_mflix.movies",
document={
"title": "Minari",
"runtime": 217,
"genres": ["Drama", "Comedy"]
}
),
UpdateOne(
namespace="sample_mflix.movies",
filter={ "title": "Minari" },
update={ "$set": { "runtime": 117 }}
),
DeleteMany(
namespace="sample_restaurants.restaurants",
filter={ "cuisine": "French" }
)
]
results = client.bulk_write(operations)
print(results)
ClientBulkWriteResult({'anySuccessful': True, 'error': None, 'writeErrors': [],
'writeConcernErrors': [], 'nInserted': 1, 'nUpserted': 0, 'nMatched': 1,
'nModified': 1, 'nDeleted': 344, 'insertResults': {}, 'updateResults': {},
'deleteResults': {}}, acknowledged=True, verbose=False)
operations = [
InsertOne(
namespace="sample_mflix.movies",
document={
"title": "Minari",
"runtime": 217,
"genres": ["Drama", "Comedy"]
}
),
UpdateOne(
namespace="sample_mflix.movies",
filter={ "title": "Minari" },
update={ "$set": { "runtime": 117 }}
),
DeleteMany(
namespace="sample_restaurants.restaurants",
filter={ "cuisine": "French" }
)
]
results = await client.bulk_write(operations)
print(results)
ClientBulkWriteResult({'anySuccessful': True, 'error': None, 'writeErrors': [],
'writeConcernErrors': [], 'nInserted': 1, 'nUpserted': 0, 'nMatched': 1,
'nModified': 1, 'nDeleted': 344, 'insertResults': {}, 'updateResults': {},
'deleteResults': {}}, acknowledged=True, verbose=False)

Opcionalmente, o método bulk_write() aceita parâmetros adicionais, que representam opções que você pode usar para configurar a operação de gravação em massa.

A tabela a seguir descreve as opções que você pode passar para o método Collection.bulk_write() :

Propriedade
Descrição

ordered

Se True, o driver executa as operações de gravação na ordem fornecida. Se ocorrer um erro, as operações restantes não serão tentadas.

Se False, o driver executa as operações em uma ordem arbitrária e tenta executar todas as operações.
O padrão é True.

bypass_document_validation

Especifica se a operação ignora a validação em nível de documento. Para obter mais informações, consulte Validação de esquema no manual do MongoDB Server .
O padrão False é.

session

Uma instância de ClientSession. Para obter mais informações, consulte a documentação da API.

comment

Um comentário a ser anexado à operação. Para obter mais informações, consulte o guia de campos de comando de exclusão no manual do MongoDB Server .

let

Um mapa de nomes e valores de parâmetros. Os valores devem ser expressões constantes ou fechadas que não façam referência aos campos do documento. Para obter mais informações, consulte a declaração let no manual do MongoDB Server .

O exemplo a seguir chama o método bulk_write() do Exemplo de gravação em massa da coleção anterior, mas define a opção ordered como False. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:

results = restaurants.bulk_write(operations, ordered=False)
results = await restaurants.bulk_write(operations, ordered=False)

Se qualquer uma das operações de gravação em uma gravação em massa não ordenada falhar, o PyMongo relatará os erros somente depois de tentar todas as operações.

Observação

Operações em massa não ordenadas não garantem ordem de execução. A ordem pode ser diferente da forma como você os lista para otimizar o tempo de execução.

A tabela a seguir descreve as opções que você pode passar para o método MongoClient.bulk_write() :

Propriedade
Descrição

session

Uma instância de ClientSession. Para obter mais informações, consulte a documentação da API.

ordered

Se True, o driver executa as operações de gravação na ordem fornecida. Se ocorrer um erro, as operações restantes não serão tentadas.

Se False, o driver executa as operações em uma ordem arbitrária e tenta executar todas as operações.
O padrão é True.

verbose_results

Especifica se a operação retorna resultados detalhados para cada operação bem-sucedida.
O padrão é False.

bypass_document_validation

Especifica se a operação ignora a validação em nível de documento. Para obter mais informações, consulte Validação de esquema no manual do MongoDB Server .
O padrão False é.

comment

Um comentário a ser anexado à operação. Para obter mais informações, consulte o guia de campos de comando de exclusão no manual do MongoDB Server .

let

Um mapa de nomes e valores de parâmetros. Os valores devem ser expressões constantes ou fechadas que não façam referência aos campos do documento. Para obter mais informações, consulte a declaração let no manual do MongoDB Server .

write_concern

Especifica a preocupação de gravação a ser usada na operação em massa. Para obter mais informações, consulte Write Concern no manual do MongoDB Server .

O exemplo a seguir chama o método bulk_write() do Exemplo de gravação em massa do cliente anterior, mas define a opção verbose_results como True. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:

results = client.bulk_write(operations, verbose_results=True)
ClientBulkWriteResult({'anySuccessful': True, 'error': None, 'writeErrors': [],
'writeConcernErrors': [], 'nInserted': 1, 'nUpserted': 0, 'nMatched': 1, 'nModified': 1,
'nDeleted': 344, 'insertResults': {0: InsertOneResult(ObjectId('...'),
acknowledged=True)}, 'updateResults': {1: UpdateResult({'ok': 1.0, 'idx': 1, 'n': 1,
'nModified': 1}, acknowledged=True)}, 'deleteResults': {2: DeleteResult({'ok': 1.0,
'idx': 2, 'n': 344}, acknowledged=True)}}, acknowledged=True, verbose=True)
results = await client.bulk_write(operations, verbose_results=True)
ClientBulkWriteResult({'anySuccessful': True, 'error': None, 'writeErrors': [],
'writeConcernErrors': [], 'nInserted': 1, 'nUpserted': 0, 'nMatched': 1, 'nModified': 1,
'nDeleted': 344, 'insertResults': {0: InsertOneResult(ObjectId('...'),
acknowledged=True)}, 'updateResults': {1: UpdateResult({'ok': 1.0, 'idx': 1, 'n': 1,
'nModified': 1}, acknowledged=True)}, 'deleteResults': {2: DeleteResult({'ok': 1.0,
'idx': 2, 'n': 344}, acknowledged=True)}}, acknowledged=True, verbose=True)

Esta seção descreve o valor de retorno dos seguintes métodos de operação em massa:

O método Collection.bulk_write() retorna um objeto BulkWriteResult . O objeto BulkWriteResult contém as seguintes propriedades:

Propriedade
Descrição

acknowledged

Indica se o servidor reconheceu a operação de gravação.

bulk_api_result

O resultado bruto da API em massa retornado pelo servidor.

deleted_count

O número de documentos excluídos, se houver.

inserted_count

O número de documentos inseridos, se houver.

matched_count

O número de documentos correspondentes para uma atualização, se aplicável.

modified_count

O número de documentos modificados, se houver.

upserted_count

O número de documentos atualizados, se houver.

upserted_ids

Um mapa do índice da operação para o _id dos documentos atualizados, se aplicável.

O método MongoClient.bulk_write() retorna um objeto ClientBulkWriteResult . O objeto ClientBulkWriteResult contém as seguintes propriedades:

Propriedade
Descrição

acknowledged

Indica se o servidor reconheceu a operação de gravação.

bulk_api_result

O resultado bruto da API em massa retornado pelo servidor.

delete_results

Um mapa de qualquer operação de exclusão bem-sucedida e seus resultados.

deleted_count

O número de documentos excluídos, se houver.

has_verbose_results

Indica se os resultados retornados são detalhados.

insert_results

Um mapa de qualquer operação de inserção bem-sucedida e seus resultados.

inserted_count

O número de documentos inseridos, se houver.

matched_count

O número de documentos correspondentes para uma atualização, se aplicável.

modified_count

O número de documentos modificados, se houver.

update_results

Um mapa de quaisquer operações de atualização bem-sucedidas e seus resultados.

upserted_count

O número de documentos atualizados, se houver.

Se você não adicionar uma anotação de tipo para seu objeto MongoClient, seu verificador de tipo poderá mostrar um erro semelhante ao seguinte:

from pymongo import MongoClient
client = MongoClient() # error: Need type annotation for "client"

A solução é anotar o objeto MongoClient como client: MongoClient ou client: MongoClient[Dict[str, Any]].

Se você especificar MongoClient como uma dica de tipo, mas não incluir tipos de dados para o documento, as chaves e os valores, seu verificador de tipo poderá mostrar um erro semelhante ao seguinte:

error: Dict entry 0 has incompatible type "str": "int";
expected "Mapping[str, Any]": "int"

A solução é adicionar a seguinte dica de tipo ao seu objeto MongoClient :

client: MongoClient[Dict[str, Any]]

Para saber como realizar operações de escrita individuais, consulte os seguintes guias:

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: