Operações de gravação em massa
Nesta página
- Visão geral
- Dados de amostra
- Definir as operações de gravação
- Inserir operações
- Atualizar operações
- Operações de substituição
- Excluir operações
- Chame o método bulk_write ()
- Exemplo de gravação em massa da collection
- Exemplo de gravação em massa do cliente
- Personalizar operações de gravação em massa
- Opções de gravação em massa da collection
- Opções de gravação em massa do cliente
- Return Values
- Valor de retorno de gravação em massa da coleção
- Valor de retorno de gravação em massa do cliente
- Informações adicionais
- Documentação da API
Visão geral
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 escrita 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
Dados de amostra
Os exemplos neste guia usam as collections sample_restaurants.restaurants
e dos sample_mflix.movies
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 tutorialIntrodução ao PyMongo.
Definir as operações de gravação
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.
Inserir operações
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" } )
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.
Atualizar operações
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" }} )
Operações de substituição
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" } )
Para substituir vários documentos, você deve criar uma instância de ReplaceOne
para cada documento.
Excluir operações
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" } )
Chame o método bulk_write ()
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 .
Exemplo de gravação em massa da collection
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
:
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)
Exemplo de gravação em massa do cliente
O seguinte exemplo 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
:
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)
Personalizar operações de gravação em massa
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.
Opções de gravação em massa da collection
A tabela a seguir descreve as opções que você pode passar para o método Collection.bulk_write()
:
Propriedade | Descrição |
---|---|
| If True , the driver performs the write operations in the order
provided. If an error occurs, the remaining operations are not
attempted.If False , the driver performs the operations in an
arbitrary order and attempts to perform all operations.Defaults to True . |
| Specifies whether the operation bypasses document-level validation. For more
information, see Schema
Validation in the MongoDB
Server manual. Defaults to False . |
| An instance of ClientSession . For more information, see the API
documentation. |
| A comment to attach to the operation. For more information, see the delete command
fields guide in the
MongoDB Server manual. |
| A map of parameter names and values. Values must be constant or closed
expressions that don't reference document fields. For more information,
see the let statement in the
MongoDB Server manual. |
O exemplo a seguir chama o bulk_write()
método do Exemplo de gravação em massa da coleção anterior, mas define a ordered
opção False
como:
results = 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.
Opções de gravação em massa do cliente
A tabela a seguir descreve as opções que você pode passar para o método MongoClient.bulk_write()
:
Propriedade | Descrição |
---|---|
| An instance of ClientSession . For more information, see the API
documentation. |
| If True , the driver performs the write operations in the order
provided. If an error occurs, the remaining operations are not
attempted.If False , the driver performs the operations in an
arbitrary order and attempts to perform all operations.Defaults to True . |
| Specifies whether the operation returns detailed results for each
successful operation. Defaults to False . |
| Specifies whether the operation bypasses document-level validation. For more
information, see Schema
Validation in the MongoDB
Server manual. Defaults to False . |
| A comment to attach to the operation. For more information, see the delete command
fields guide in the
MongoDB Server manual. |
| A map of parameter names and values. Values must be constant or closed
expressions that don't reference document fields. For more information,
see the let statement in the
MongoDB Server manual. |
| Specifies the write concern to use for the bulk operation.
For more information, see Write Concern
in the MongoDB Server manual. |
O exemplo a seguir chama o bulk_write()
método do Exemplo de gravação em massa do cliente anterior, mas define a verbose_results
opção True
como:
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)
Return Values
Esta seção descreve o valor de retorno dos seguintes métodos de operação em massa:
Valor de retorno de gravação em massa da coleção
O método Collection.bulk_write()
retorna um objeto BulkWriteResult
. O objeto BulkWriteResult
contém as seguintes propriedades:
Propriedade | Descrição |
---|---|
| Indicates if the server acknowledged the write operation. |
| The raw bulk API result returned by the server. |
| The number of documents deleted, if any. |
| The number of documents inserted, if any. |
| The number of documents matched for an update, if applicable. |
| The number of documents modified, if any. |
| The number of documents upserted, if any. |
| A map of the operation's index to the _id of the upserted documents, if
applicable. |
Valor de retorno de gravação em massa do cliente
O método MongoClient.bulk_write()
retorna um objeto ClientBulkWriteResult
. O objeto ClientBulkWriteResult
contém as seguintes propriedades:
Propriedade | Descrição |
---|---|
| Indicates if the server acknowledged the write operation. |
| The raw bulk API result returned by the server. |
| A map of any successful delete operations and their results. |
| The number of documents deleted, if any. |
| Indicates whether the returned results are verbose. |
| A map of any successful insert operations and their results. |
| The number of documents inserted, if any. |
| The number of documents matched for an update, if applicable. |
| The number of documents modified, if any. |
| A map of any successful update operations and their results. |
| The number of documents upserted, if any. |
Informações adicionais
Para saber como realizar operações de escrita individuais, consulte os seguintes guias:
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: