Overview
En esta guía, puede aprender cómo realizar una operación upsert con el controlador Java de MongoDB.
Las aplicaciones utilizan operaciones de inserción y actualización para almacenar y modificar datos. A veces, es necesario elegir entre insertar y actualizar dependiendo de si el documento existe o no. MongoDB simplifica esta decisión con... upsert opción.
An upsert:
Actualiza los documentos que coinciden con su filtro de consulta
Inserta un documento si no hay coincidencias con su filtro de query.
Especificar un Upsert
Para especificar un upsert con los métodos updateOne() o updateMany(), pase true a UpdateOptions.upsert().
Para especificar un upsert con el método replaceOne(), pase true a ReplaceOptions.upsert().
En el siguiente ejemplo, una tienda de pinturas vende ocho colores diferentes. La tienda realizó 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ó un nuevo envío y necesita actualizar su inventario. El primer artículo del envío son diez latas de pintura naranja.
Para actualizar el inventario, consulte la colección paint_inventory donde color es "orange", especifique una actualización de increment el campo qty por 10 y especifique 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 }}
Esto AcknowledgedUpdateResult nos dice:
Cero documentos coincidieron con nuestro filtro de consulta
Ningún documento de nuestra colección fue modificado
Se insertó un documento con un
_idde606b4cfc1601f9443b5d6978
A continuación se muestran los documentos de 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
Si no se incluye UpdateOptions no se produce 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 API: