Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Update Documents

En esta guía, puedes aprender a actualizar documentos en una colección de MongoDB. Las operaciones de actualización especifican los campos y valores a cambiar en uno o más documentos. Aplican los cambios especificados en un documento de actualización a uno o más documentos que coinciden con su filtro de query.

Para aprender cómo actualizar arreglos incrustados o actualizar o insertar en una sola operación, consulta las siguientes páginas:

  • Actualizar arreglos en un documento

  • Insertar o Actualizar en una Operación Única

Las operaciones de actualización pueden modificar campos y valores:

  • La updateOne() método cambia el primer documento que coincida con el filtro de query y el

  • El método updateMany() cambia todos los documentos que coincidan con su filtro de query.

Puede llamar al updateOne() y updateMany() métodos en una instancia de MongoCollection como sigue:

collection.updateOne(<query>, <updateDocument>);
collection.updateMany(<query>, <updateDocument>);

Los métodos updateOne() y updateMany() tienen ambos los siguientes parámetros:

  • query Especifica un filtro de consulta con los criterios para hacer coincidir los documentos que desea actualizar en su colección.

  • update especifica los campos y valores a modificar en el documento o documentos coincidentes. Los ejemplos de esta sección utilizan el Updates desarrolladores para crear el documento de actualización.

  • (Opcional) updateOptions especifica opciones que puede configurar para personalizar cómo el driver realiza la operación de actualización. Para conocer más sobre este tipo, consulta la documentación de la API de OpcionesDeActualización.

Puedes crear el updateDocument utilizando un generador Updates de la siguiente manera:

Bson update = Updates.operator(<field>, <value>);

Para ver una lista completa de los desarrolladores de Updates y su uso, consulta Actualizaciones en la documentación de la API.

En los siguientes ejemplos, una tienda de pintura vende cinco colores diferentes de pintura. La colección paint_inventory representa su inventario actual:

{ "_id": 1, "color": "red", "qty": 5 }
{ "_id": 2, "color": "purple", "qty": 8 }
{ "_id": 3, "color": "yellow", "qty": 0 }
{ "_id": 4, "color": "green", "qty": 6 }
{ "_id": 5, "color": "pink", "qty": 0 }

El siguiente ejemplo demuestra cómo cambiar el valor del campo color en el primer documento coincidente en el que el valor de qty es 0:

Bson filter = Filters.eq("qty", 0);
Bson update = Updates.set("color", "dandelion");
// Updates first matching document
UpdateResult result = collection.updateOne(filter, update);

Si varios documentos cumplen con el filtro de query especificado en el método updateOne(), se actualiza el primer resultado. Puedes especificar un orden en una instancia UpdateOptions para aplicar un orden a los documentos coincidentes antes de que el servidor realice la operación de actualización, como se muestra en el siguiente código:

UpdateOptions options = UpdateOptions.sort(ascending("color"));
UpdateResult result = collection.updateOne(filter, document, options);

La tienda de pinturas recibe un nuevo envío y necesita actualizar su inventario. El envío contiene 20 latas de cada color de pintura.

Para actualizar el inventario, llame al método updateMany() especificando lo siguiente:

  • Filtro de consulta que coincide con todos los colores

  • Actualizar el documento que contiene instrucciones para incrementar el campo qty en 20

Bson filter = Filters.empty();
Bson update = Updates.inc("qty", 20);
// Updates all documents and prints the number of matched and modified documents
UpdateResult result = collection.updateMany(filter, update);
System.out.println("Matched document count: " + result.getMatchedCount());
System.out.println("Modified document count: " + result.getModifiedCount());

La salida del código anterior se parece a la siguiente:

Matched document count: 5
Modified document count: 5

A continuación se muestran los documentos actualizados en la colección paint_inventory:

{ "_id": 1, "color": "red", "qty": 25 }
{ "_id": 2, "color": "purple", "qty": 28 }
{ "_id": 3, "color": "yellow", "qty": 20 }
{ "_id": 4, "color": "green", "qty": 26 }
{ "_id": 5, "color": "pink", "qty": 20 }

Si ningún documento coincide con el filtro de query en la operación de actualización, updateMany() no realiza ningún cambio en los documentos de la colección. Consulta nuestra guía de inserción para aprender cómo insertar un nuevo documento en lugar de actualizar uno si no hay documentos que coincidan.

Importante

Los métodos updateOne() y updateMany() no pueden realizar cambios en un documento que infrinjan las restricciones de índice único en la colección. Para más información sobre las restricciones en índices únicos, consulte Índices Únicos en el manual del Servidor de MongoDB.

Nota

Configuración de ejemplo

Este ejemplo se conecta a una instancia de MongoDB mediante un URI de conexión. Para obtener más información sobre cómo conectarse a su instancia de MongoDB, consulte la guía Crear un MongoClient. Este ejemplo también utiliza la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Puede cargarlos en su base de datos en el nivel gratuito de MongoDB Atlas siguiendo el MongoDB Comenzar.

El siguiente código es un archivo completo y autónomo que realiza una operación de actualización única y una operación de actualización múltiple:

// Updates the first document that matches a query filter by using the Java driver
package org.example;
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;
import static com.mongodb.client.model.Filters.gt;
public class Update {
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");
// Instructs the driver to insert a new document if none match the query
UpdateOptions options = new UpdateOptions().upsert(true);
Document updateOneQuery = new Document().append("title", "Cool Runnings 2");
// Creates instructions to update the values of three document fields
Bson updateOneUpdates = Updates.combine(
Updates.set("runtime", 99),
Updates.addToSet("genres", "Sports"),
Updates.currentTimestamp("lastUpdated"));
// Updates the first document that has a "title" value of "Cool Runnings 2"
UpdateResult result = collection.updateOne(updateOneQuery, updateOneUpdates, options);
// Prints the number of updated documents and the upserted document ID, if an upsert was performed
System.out.println("Number of documents updated - update one: " + result.getModifiedCount());
System.out.println("Upserted document ID: " + result.getUpsertedId());
Bson updateManyQuery = gt("num_mflix_comments", 50);
// Creates instructions to update the values of two document fields
Bson updateManyUpdates = Updates.combine(
Updates.addToSet("genres", "Frequently Discussed"),
Updates.currentTimestamp("lastUpdated"));
// Updates documents that have a "num_mflix_comments" value over 50
UpdateResult result = collection.updateMany(updateManyQuery, updateManyUpdates);
// Prints the number of updated documents
System.out.println("\nNumber of documents updated - update many: " + result.getModifiedCount());
}
}
}
updateOne() modified document count: 1
Upserted ID: null
updateMany() modified document count: 242

Una operación de reemplazo sustituye un documento de su colección. La sustitución se produce entre un documento que coincide con el filtro de consulta y un documento de reemplazo.

El método replaceOne() elimina todos los campos y valores existentes en el documento coincidente (excepto el _id campo) y lo sustituye con el documento de reemplazo.

Puedes llamar al método replaceOne() en una instancia de MongoCollection de la siguiente manera:

collection.replaceOne(<query>, <replacement>);

El método replaceOne() tiene los siguientes parámetros:

  • query especifica un filtro de query con los criterios para hacer coincidir un documento para reemplazar en la colección.

  • replacement especifica los campos y valores de un nuevo objeto Document para reemplazar el documento coincidente.

  • (Opcional) replaceOptions especifica opciones que puedes establecer para personalizar cómo el controlador ejecuta la operación de reemplazo. Para obtener más información sobre este tipo, consulte la documentación de la API de ReplaceOptions.

La tienda de pinturas se da cuenta de que debe actualizar su inventario nuevamente. Lo que pensaban que eran 20 botes de pintura rosa en realidad son 25 botes de pintura naranja.

Para actualizar el inventario, llame al método replaceOne() especificando lo siguiente:

  • Un filtro de query que coincide con documentos donde el color es "rosa".

  • Un documento de reemplazo donde el color es "naranja" y el qty es "25"

Bson filter = Filters.eq("color", "pink");
Document document = new Document("color", "orange").append("qty", 25);
// Replaces the first document that matches the filter with a new document
UpdateResult result = collection.replaceOne(filter, document);
// Prints the number of matched and modified documents
System.out.println("Matched document count: " + result.getMatchedCount());
System.out.println("Modified document count: " + result.getModifiedCount());

La salida del código anterior se parece a la siguiente:

Matched document count: 1
Modified document count: 1

Lo siguiente muestra el documento actualizado:

{ "_id": 5, "color": "orange", "qty": 25 }

Si varios documentos coinciden con el filtro de consulta especificado en el método replaceOne(), este reemplaza el primer resultado. Puede especificar una ordenación en una instancia ReplaceOptions para aplicar un orden a los documentos coincidentes antes de que el servidor realice la operación de reemplazo, como se muestra en el siguiente código:

ReplaceOptions options = ReplaceOptions.sort(ascending("qty"));
UpdateResult result = collection.replaceOne(filter, document, options);

Si cero documentos coinciden con el filtro de query en la operación de reemplazo, replaceOne() no realiza ningún cambio en los documentos de la colección. Consulta nuestra guía de inserción para aprender a insertar un documento nuevo en lugar de reemplazar uno si no hay coincidencias.

Importante

El replaceOne() método no puede realizar cambios en un documento que infrinjan las restricciones de índice único de la colección. Para obtener más información sobre las restricciones de índice único, consulte Índices únicos en el manual de MongoDB Server.

Nota

Configuración de ejemplo

Este ejemplo se conecta a una instancia de MongoDB mediante un URI de conexión. Para obtener más información sobre cómo conectarse a su instancia de MongoDB, consulte la guía Crear un MongoClient. Este ejemplo también utiliza la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Puede cargarlos en su base de datos en el nivel gratuito de MongoDB Atlas siguiendo el MongoDB Comenzar.

El siguiente código es un archivo completo y autónomo que realiza una operación de reemplazo uno.

// Replaces the first document that matches a filter by using the Java driver
package org.example;
import static com.mongodb.client.model.Filters.eq;
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.ReplaceOptions;
import com.mongodb.client.result.UpdateResult;
public class ReplaceOne {
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 = eq("title", "Music of the Heart");
// Creates a new document containing "title" and "fullplot" fields
Document replaceDocument = new Document().
append("title", "50 Violins").
append("fullplot", " A dramatization of the true story of Roberta Guaspari who co-founded the Opus 118 Harlem School of Music");
// Instructs the driver to insert a new document if none match the query
ReplaceOptions opts = new ReplaceOptions().upsert(true);
// Replaces the first document that matches the filter with a new document
UpdateResult result = collection.replaceOne(query, replaceDocument, opts);
// Prints the number of modified 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 replace due to an error: " + me);
}
}
}
Modified document count: 0
Upserted id: BsonObjectId{ ... }

Para obtener más información sobre los métodos y clases utilizados en esta página, consulta la siguiente documentación de la API:

Volver

Acceder a datos desde un cursor

En esta página