Atualizar um documento
Você pode atualizar um único documento usando o método updateOne()
em um objeto MongoCollection
. O método aceita um filtro que corresponde ao documento que você deseja atualizar e uma instrução de atualização que instrui o driver como alterar o documento correspondente. O método updateOne()
atualiza somente o primeiro documento que corresponde ao filtro.
Para realizar uma atualização com o método updateOne()
, você deve utilizar um filtro de query e um documento de atualização. O filtro de query especifica os critérios para determinar em qual documento realizar a atualização e o documento de atualização fornece instruções sobre quais alterações devem ser feitas nele.
Opcionalmente, você pode passar uma instância de UpdateOptions
para o método updateOne()
para especificar o comportamento do método. Por exemplo, se você definir o campo upsert
do objeto UpdateOptions
como true
, a operação inserirá um novo documento dos campos na query e atualizará o documento se nenhum documento corresponder ao filtro de query. Consulte o link para a documentação da API de UpdateOptions
na parte inferior desta página para obter mais informações.
Após a execução bem-sucedida, o método updateOne()
gera uma instância de UpdateResult
. Você pode recuperar informações como o número de documentos modificados chamando o método getModifiedCount()
ou o valor do campo _id
chamando o método getUpsertedId()
se tiver especificado upsert(true)
em uma instância UpdateOptions
.
Se a sua operação de atualização falhar, o driver emitirá uma exceção. Por exemplo, se você tentar definir um valor para o campo imutável _id
em seu documento de atualização, o método 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 updateOne()
, cujo link está no final desta página.
Exemplo
Neste exemplo, atualizamos a primeira correspondência para nossa query na collection movies
do banco de dados sample_mflix
. Realizamos as seguintes atualizações no documento correspondente:
Defina o valor de
runtime
para99
Adicione
Sports
à 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 ajuda 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. Para obter mais informações sobre o construtor Updates
, consulte nosso guia sobre o construtor de atualizaçõ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 the first document that matches a query filter by using the Java driver package usage.examples; 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.UpdateOptions; import com.mongodb.client.model.Updates; import com.mongodb.client.result.UpdateResult; public class UpdateOne { 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"); Document query = new Document().append("title", "Cool Runnings 2"); // Creates instructions to update the values of three document fields Bson updates = Updates.combine( Updates.set("runtime", 99), Updates.addToSet("genres", "Sports"), Updates.currentTimestamp("lastUpdated")); // Instructs the driver to insert a new document if none match the query UpdateOptions options = new UpdateOptions().upsert(true); try { // Updates the first document that has a "title" value of "Cool Runnings 2" UpdateResult result = collection.updateOne(query, updates, options); // Prints the number of updated documents and the upserted document ID, if an upsert was performed System.out.println("Modified document count: " + result.getModifiedCount()); System.out.println("Upserted id: " + result.getUpsertedId()); // 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: 1 Upserted id: null
Ou se o exemplo resultou em um upsert:
Modified document count: 0 Upserted id: BsonObjectId{value=...}
Se você query o documento atualizado, a saída será semelhante à seguinte:
Document { { _id=..., plot=..., genres=[Adventure, Comedy, Family, Sports], runtime=99, ... 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: