Overview
En esta guía, puede aprender a realizar una actualización o inserción con el controlador Java de MongoDB.
Las aplicaciones utilizan operaciones de inserción y actualización para almacenar y modificar datos. A veces, necesitas elegir entre una inserción o una actualización dependiendo de si el documento existe. MongoDB simplifica esta decisión para nosotros con un upsert opción.
An upsert:
Actualiza documentos que coinciden con tu filtro de query
Inserta un documento si no hay coincidencias con su filtro de query.
Especificar una inserción
Para especificar una inserción con los métodos updateOne() o updateMany(), pasa true a UpdateOptions.upsert().
Para especificar una operación de actualización/inserción (upsert) con el método replaceOne(), se debe pasar true a ReplaceOptions.upsert().
En el siguiente ejemplo, una tienda de pinturas vende ocho colores diferentes de pintura. La tienda tuvo su venta anual en línea. Su colección paint_inventory ahora muestra los siguientes documentos:
{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 } { "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 } { "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 } { "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 }
La tienda recibió una nueva remesa y necesita actualizar su inventario. El primer elemento del envío son diez latas de pintura naranja.
Para actualizar el inventario, query la colección paint_inventory donde el color sea "orange", especifica una actualización para increment el campo qty en 10, y especifica true a UpdateOptions.upsert():
// Creates a filter and update document to increment the matching document's "qty" value Bson filter = Filters.eq("color", "orange"); Bson update = Updates.inc("qty", 10); // Updates the matching document or inserts a document if none match the query filter UpdateOptions options = new UpdateOptions().upsert(true); System.out.println(collection.updateOne(filter, update, options));
El método devuelve:
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=BsonObjectId{ value=606b4cfc1601f9443b5d6978 }}
Este AcknowledgedUpdateResult nos indica lo siguiente:
Ningún documento coincidió con nuestro filtro de query
Ningún documento de nuestra colección fue modificado
Se insertó o actualizó un documento con un
_idde606b4cfc1601f9443b5d6978.
Lo siguiente muestra los documentos en la colección paint_inventory:
{ "_id": { "$oid": "606b4cfbcd83be7518b958da" }, "color": "red", "qty": 5 } { "_id": { "$oid": "606b4cfbcd83be7518b958db" }, "color": "purple", "qty": 8 } { "_id": { "$oid": "606b4cfbcd83be7518b958dc" }, "color": "blue", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958dd" }, "color": "white", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958de" }, "color": "yellow", "qty": 6 } { "_id": { "$oid": "606b4cfbcd83be7518b958df" }, "color": "pink", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e0" }, "color": "green", "qty": 0 } { "_id": { "$oid": "606b4cfbcd83be7518b958e1" }, "color": "black", "qty": 8 } { "_id": { "$oid": "606b4cfc1601f9443b5d6978" }, "color": "orange", "qty": 10 }]
Nota
No incluir UpdateOptions no genera ningún cambio en la colección.
Bson filter = Filters.eq("color", "orange"); Bson update = Updates.inc("qty", 10); System.out.println(collection.updateOne(filter, update));
El método devuelve:
AcknowledgedUpdateResult{ matchedCount=0, modifiedCount=0, upsertedId=null }
Para obtener más información sobre los métodos y clases mencionados en esta sección, consulte la siguiente documentación de la API: