José Alberto Ortiz Vargas
Nestor Ospina
Andres Trujillo
Cuando trabajas con sensores IoT que envían lecturas constantes a MongoDB, necesitas decidir entre insertar un documento nuevo o actualizar uno existente. La operación upsert en MongoDB resuelve ese dilema con una sola instrucción y evita consultas extra para verificar si el documento ya existe.
Esto te interesa si construyes pipelines de datos para sensores, registros diarios o cualquier sistema donde la lógica dependa de "si existe, actualiza; si no, crea".
Por qué guardar lecturas de sensores en MongoDB
Las bases de datos documentales como MongoDB encajan muy bien con cargas IoT porque escriben mucho y permiten estructuras flexibles por documento.
En el caso de la clase, la colección iot dentro de Platzi Store guarda un documento por sensor y por fecha. Cada documento contiene:
A0001.readings con todas las lecturas de ese sensor en ese día.La regla de modelado es clara: un sensor + una fecha = un solo documento. La primera lectura del día crea el documento. Las siguientes lecturas solo agregan valores al array.
¿Por qué usar bases de datos documentales para IoT? Porque los sensores escriben con mucha frecuencia y los documentos permiten guardar arrays de lecturas crecientes sin reestructurar tablas. [01:08]
Cómo decidir entre insertOne y updateOne sin upsert
Antes de conocer upsert, la solución típica era programática. Lanzas un find con la consulta del sensor y la fecha, aplicas un count y según el resultado eliges el método.
insertOne con el documento completo.updateOne y haces push de la nueva lectura.Funciona, pero te obliga a viajar dos veces a la base de datos y a escribir lógica condicional en tu aplicación. Aquí entra la solución elegante de Mongo.
Cómo agregar una lectura con push y corregir errores con pop
Durante la clase aparece un detalle muy común. Al ejecutar un updateOne con $push sobre readings, se insertó un sub-array en lugar de un valor numérico suelto. El error estaba en pasar un array al operador push cuando solo debías pasar el valor directo. [05:30]
Para revertirlo se usa $pop, un operador que elimina elementos de un array según su posición:
$pop: 1 elimina el último elemento del array.$pop: -1 elimina el primer elemento del array.Después de limpiar el array con pop, se vuelve a hacer push pasando el valor numérico tal cual y el documento queda correcto.
Cómo funciona upsert en MongoDB con updateOne
Upsert es la fusión entre update e insert. Le indicas a MongoDB que ejecute una actualización y, si el documento no existe, lo cree con los datos del filtro y del update.
La sintaxis es directa: dentro de updateOne agregas un tercer parámetro con upsert: true. [09:15]
js db.iot.updateOne( { sensor: "A0001", date: "2022-01-04" }, { $push: { readings: 23 } }, { upsert: true } )
El flujo se vuelve mucho más limpio:
A0001 en la fecha 2022-01-04, MongoDB lo crea con esa primera lectura.¿Qué es upsert en MongoDB? Es una bandera del método updateOne que crea el documento si no existe o lo actualiza si ya existe, todo en una sola operación.
¿Upsert funciona con cualquier método de actualización? En esta clase se muestra con updateOne, que es donde se envía la bandera
upsert: truepara decidir entre crear o modificar el documento.
Un detalle del Playground que te puede confundir
Un punto práctico que aparece al final: el Playground de MongoDB ejecuta el bloque donde tienes el cursor o la selección activa. Si tienes seleccionado un fragmento, solo correrá ese fragmento y puede parecer que tu upsert no se aplicó.
Deja el cursor al final del archivo cuando quieras correr todo, o selecciona conscientemente solo el bloque que te interesa probar. [12:40]
Operadores y conceptos clave de la clase
Para que el modelo y las operaciones funcionen, conviene tener claro cada pieza:
readings de un documento existente. [05:00]-1) o último (1) elemento de un array, útil para corregir inserciones equivocadas. [06:45]Con esta combinación tu pipeline de IoT escribe menos código, hace menos consultas y mantiene la integridad del modelo: un documento por sensor y por día, con todas sus lecturas dentro.
¿En qué proyecto usarías upsert primero, en sensores, en logs o en perfiles de usuario? Cuéntame en los comentarios cómo lo aplicarías.
José Alberto Ortiz Vargas
Nestor Ospina
Andres Trujillo
José Alberto Ortiz Vargas
Italo Buitron
Sergio Andrés Bolaños Penagos
Luis Alvarez
Esteban Sanabria
Antonio Mesa Casares
Ronaldo Jiménez
Diego Jurado
Jessica Placencio
Rafael MoralesReyes
Roberto Shirásago Domínguez
Pablo Cesar Acosta Paredes
El código del minuto 5:59 estsa incorrecto, para que les funcione debe ejecutar el siguiente código con el operador $push:
db.iot.updateOne({ sensor: "A001", date: "2022-01-03", }, { $push: { readings: [2323] } })
Gracias por el aporte , falto el operador atómico 👌 $push
por qué esta mal?
upsert: Esta condición permite agregar un elemento en un array dentro de un documento. Lo que lo hace especial es que si el documento no existe, este operador lo crea, y si ya existe, inserta los nuevo elementos del array sobre el documento existente.
Otra opcion para agregar valores en un array es el operardor "$addToSet"
Pero hasta donde recuerdo ese solo te permite agregar los que no sean repetidos
Este es mi aporte de resumen:
use("platzi_store") //Use Upsert para crear o actualizar un registro. db.iot.updateOne({ sensor: "A001", date: "2022-01-04", }, { $push: { readings: 12434 } },{ upsert: true // El operador $push agrega un valor al array readings en el documento existente que coincide con los criterios de búsqueda sensor: "A001" y date: "2022-01-04". Si no existe un documento que cumpla con esos criterios, se crea uno nuevo debido al uso de upsert: true. })
Por si alguien lo necesita:
db.iot.insertMany([ { _id: 1, sensor: "A001", date: "2022-01-01", readings: [1,2,3,4] }, { _id: 2, sensor: "A001", date: "2022-01-02", readings: [1,2,3,4] }, { _id: 3, sensor: "A002", date: "2022-01-01", readings: [1,2,3,4] }, { _id: 4, sensor: "A002", date: "2022-01-02", readings: [1,2,3,4] },])
db.iot.find()
En este caso vamos a ver un ejemplo de documentos donde guardamos información de sensores iot. Las bases de datos documentales son perfectas para este tipo de información, ya que se requiere la lectura y escritura rápida de información, además de haber muchos datos.
use('football'); // si existen los datos los actualiza, sino crea un nuevo registro db.teams.updateOne({ name: "Atletico Madrid", }, { $set: { name: "Atletico Madrid", league: "La Liga", country: "Spain" } },{upsert:true});
Muy bueno ir viendo el curso ya con temas prácticos
Pienso que vale la pena diferenciar lo siguiente:
findOneAndUpdate(), find(), insertOne(), updateOne().$set, $inc, $in, $gte, $push.upsert: true, new: true, ordered: false.Trabajo en iot y desconocía esta característica de mongo, me va a facilitar mucho la existencia a la hora de conectar nuevos sensores
Interesante con razón copilot me recomendaba poner upsert en los update
Genial y muy interesante esta clase 👌👏