Atualizar vários documentos
Você pode atualizar diversos documentos usando o método updateMany()
em um objeto MongoCollection
. O método aceita um filtro que corresponde ao documento que você deseja atualizar e uma declaração de atualização que instrui o driver como alterar o documento correspondente. O método updateMany()
atualiza todos os documentos na collection que correspondem ao filtro.
Para realizar uma atualização com o método updateMany()
, você deve utilizar um filtro de query e um documento de atualização. O filtro de query especifica quais documentos da collection devem ser correspondidos, e o documento de atualização fornece instruções sobre quais alterações devem ser feitas neles.
Opcionalmente, você pode passar uma instância de UpdateOptions
para o método updateMany()
para modificar o comportamento da chamada. Por exemplo, se você definir o campo upsert
do objeto UpdateOptions
como true
e nenhum documento corresponder ao filtro de query especificado, a operação insere um novo documento composto pelos campos do documento de query e de atualização.
Após a execução bem-sucedida, o método updateMany()
gera uma instância de UpdateResult
. Você pode recuperar informações, como o número de documentos modificados, chamando o método getModifiedCount()
. Se você especificou upsert(true)
em um objeto UpdateOptions
e a operação resultar em uma inserção, você poderá recuperar o campo _id
do novo documento chamando o método getUpsertedId()
na instância UpdateResult
.
Se sua operação de atualização falhar, o driver gerará uma exceção e não atualizará nenhum dos documentos correspondentes ao filtro. Por exemplo, se você tentar definir um valor para o campo imutável _id
em seu documento de atualização, o método updateMany()
não atualizará nenhum documento e lançará um MongoWriteException
com a mensagem:
Performing an update on the path '_id' would modify the immutable field '_id'
Se o seu documento de atualização contiver uma alteração que viole as regras do índice único, o método lançará um MongoWriteException
com uma mensagem de erro semelhante à seguinte:
E11000 duplicate key error collection: ...
Para obter mais informações sobre os tipos de exceções geradas em condições específicas, consulte a documentação da API para updateMany()
, cujo link está no final desta página.
Exemplo
Neste exemplo, atualizamos documentos que correspondem a nossa query na collection movies
do banco de dados sample_mflix
. Realizamos as seguintes atualizações nos documentos correspondentes:
Adicione
Frequently Discussed
à array degenres
somente se ela ainda não existirDefina o valor de
lastUpdated
para o horário atual.
Usamos o construtor Updates
, uma classe de fábrica que contém métodos de assistente estática para construir o documento de atualização. Embora você possa passar um documento de atualização em vez de usar o construtor, o construtor oferece verificação de tipo e sintaxe simplificada. Leia nossoguia sobre atualizações na seção Construtores para obter mais informações.
Observação
Esse exemplo se conecta a uma instância do MongoDB usando um URI de conexão. Para saber mais sobre como se conectar à sua instância do MongoDB, consulte o Guia de conexão.
// Updates documents that match a query filter by using the Java driver package usage.examples; import static com.mongodb.client.model.Filters.gt; import org.bson.Document; import org.bson.conversions.Bson; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Updates; import com.mongodb.client.result.UpdateResult; public class UpdateMany { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); Bson query = gt("num_mflix_comments", 50); // Creates instructions to update the values of two document fields Bson updates = Updates.combine( Updates.addToSet("genres", "Frequently Discussed"), Updates.currentTimestamp("lastUpdated")); try { // Updates documents that have a "num_mflix_comments" value over 50 UpdateResult result = collection.updateMany(query, updates); // Prints the number of updated documents System.out.println("Modified document count: " + result.getModifiedCount()); // Prints a message if any exceptions occur during the operation } catch (MongoException me) { System.err.println("Unable to update due to an error: " + me); } } } }
Depois de executar o exemplo, você verá um resultado parecido com este:
Modified document count: 53
Se você consultar o documento ou documentos atualizado(s), ele(s) deverá(ão) se parecer com o seguinte:
[ Document { { _id=..., plot=..., genres=[..., Frequently Discussed, ...], ... lastUpdated=Timestamp{...} } }, ... ]
Dica
Legacy API
Se você estiver usando a API herdada, consulte nossa página de perguntas frequentes para saber quais alterações devem ser feitas nesse exemplo de código.
Para obter mais informações sobre as classes e métodos mencionados nesta página, consulte a seguinte documentação da API: