Crear Documentos con upsert
Un "upsert" es un tipo especial de operación de actualización que actualiza un documento si existe o inserta uno nuevo si no lo hace. Esto es útil para evitar la lógica separada de "verificar-luego-insertar" y asegura la atomicidad en las operaciones de base de datos. Los upserts son particularmente valiosos en escenarios donde se desea:
- Asegurar la consistencia de los datos: En lugar de verificar primero si un documento existe y luego decidir si insertar o actualizar, se puede realizar una única operación que maneje ambos casos atómicamente.
- Manejar operaciones concurrentes: En entornos multiusuario, un upsert previene las condiciones de carrera (race conditions) donde otro proceso podría insertar el mismo documento entre las operaciones de verificación e inserción.
- Simplificar la lógica de la aplicación: Reduce la necesidad de lógica condicional compleja en el código de la aplicación, haciéndolo más mantenible y menos propenso a errores.
Puede habilitar este comportamiento añadiendo la opción upsert: true a su comando de actualización.
Intentemos añadir un nuevo libro, "Cloud Computing Essentials". Dado que este libro no existe en nuestra colección, la operación upsert lo creará.
db.books.updateOne(
{ title: "Cloud Computing Essentials" },
{ $set: { author: "David Lee", year: 2023, pages: 300 } },
{ upsert: true }
);
El comando consta de tres partes:
- El filtro:
{ title: "Cloud Computing Essentials" }
- La actualización:
{ $set: { ... } }
- Las opciones:
{ upsert: true }
Debido a que ningún documento coincidió con el filtro, se creó uno nuevo. El objeto de resultado lo refleja incluyendo un upsertedId.
{
acknowledged: true,
matchedCount: 0,
modifiedCount: 0,
upsertedCount: 1,
upsertedId: ObjectId("...")
}
Ahora, ejecutemos el mismo comando de nuevo. Esta vez, MongoDB encontrará el documento que acabamos de crear y lo actualizará.
db.books.updateOne(
{ title: "Cloud Computing Essentials" },
{ $set: { author: "David Lee", year: 2023, pages: 300 } },
{ upsert: true }
);
El resultado ahora muestra matchedCount: 1. Dado que los datos que estamos estableciendo son los mismos que los datos existentes, modifiedCount es 0. Si hubiéramos cambiado un valor, modifiedCount sería 1.
{
"acknowledged": true,
"insertedId": null,
"matchedCount": 1,
"modifiedCount": 0,
"upsertedCount": 0
}
Puede verificar que el nuevo libro existe en la colección.
db.books.findOne({ title: "Cloud Computing Essentials" });
La salida mostrará el documento recién creado.
{
_id: ObjectId("..."),
title: 'Cloud Computing Essentials',
author: 'David Lee',
year: 2023,
pages: 300
}
Cuando haya terminado, puede salir del Shell de MongoDB.
exit;