¿Cómo utilizar operadores para actualizar datos en MongoDB?
MongoDB es una herramienta poderosa y flexible para la gestión de bases de datos no relacionales. Una de sus características más innovadoras son los operadores, que permiten realizar consultas y actualizaciones complejas de manera eficiente. A lo largo de este contenido, exploraremos cómo se utilizan los operadores para ejecutar actualizaciones y consultas específicas.
¿Qué son los operadores en MongoDB?
Los operadores en MongoDB son herramientas que permiten realizar búsquedas, filtros, e incluso actualizaciones masivas de documentos dentro de una colección. Existen varios tipos de operadores como de comparación, aritméticos, de array, entre otros.
Operadores de comparación: permiten comparar el valor de un campo con un valor determinado, como $eq (igual a), $gt (mayor que), $gte (mayor o igual a), $lt (menor que) y $lte (menor o igual a).
Operadores de array: facilitan la manipulación de datos dentro de arrays, como $push, $pull y $addToSet.
¿Cómo usar operadores para actualizar documentos?
Uno de los casos prácticos interesantes es la actualización de datos utilizando operadores. Supongamos que queremos actualizar los documentos de sensores que coinciden con cierta condición específica.
Queremos eliminar elementos de un array llamado readings en documentos que cumplen con una condición, usando el operador pull.
$pull: es el operador utilizado para eliminar elementos de un array.
readings: es el array del que queremos remover datos.
{ $gte: 3 }: especifica que queremos eliminar todas las lecturas mayores o iguales a 3.
Al ejecutar esta operación, se modificarán los documentos que cumplan con la condición, eliminando los elementos adecuados de sus arrays.
¿Cómo realizar consultas avanzadas en MongoDB Compass?
MongoDB Compass es una interfaz gráfica que permite a los usuarios interactuar con sus bases de datos sin necesidad de escribir código directamente. Desde esta herramienta, es posible ejecutar consultas complejas combinando operadores.
Filtrar datos por duración de viajes
En una colección de viajes, podemos querer hablar sobre aquellos cuya duración es menor a cierto tiempo, digamos 200 segundos.
{ trip_duration:{ $lte:200}}
Combinando consultas: filtro por tipo de usuario
Además, podemos combinar operadores para refinar aún más nuestras consultas. Si estamos interesados en viajes cortos realizados por usuarios suscritos a un servicio de bicis, podemos usar:
Con estas consultas unidas en Compass, se pueden realizar análisis más finos, por ejemplo, identificando patrones asociados con usuarios frecuentes o determinando la eficiencia de un servicio en relación a tiempos de traslados promedio.
¿Cómo mejorar tus habilidades en MongoDB?
Ahora que tienes una idea de cómo usar los operadores en MongoDB, te animamos a practicar e implementar tus propias consultas y actualizaciones. Juega con los datasets, experimenta y personaliza las consultas para resolver tus necesidades específicas. Con el tiempo, dominarás MongoDB y podrás sacar el máximo provecho de esta potente herramienta. ¡Sigue explorando, cada consulta que creas te acerca más al dominio completo de tus bases de datos!
Dejo el ej de una consulta en JS, en la cual traemos los productos que cumplan con el rango de precio indicado en una query por un cliente.
En Js funcionan las consultas como en MongoDB_?
Vyah que No logro acostumbrarme a esta $Suntaxis tan compleja de MongoDB repecto a tantos { $ : {},{} } , Yo me esoty forzando a realizar ejercisiso similares respecto a mi Collections de Products en mi ITStore <DB> por la Terminal de Contenedor Docker, y siempre me fallase algo.
\nMe vo a quedar par horas mas -2hrs esta Noche para sacar este curso entendiendo bien cada cosa haber si se me qaueda esta sintaxis tan redundantes de ( { [ $ : ] } ) y asi me acostumbro a esta nueva Paradigma de BasesDatos != SQL.
Los operadores en la documentación de mongo:
Este es mi aporte.
// Cambia el tipo de usuario a 'Costumer' de todas los documentos que tripduration mayores a 2000use("sample_training")db.trips.updateMany(// query{tripduration:{$gt:2000}},// update with operations{$set:{usertype:"Costumer"}})// Muestra todos los documentos con tripduration mayor a 2000use("sample_training")db.trips.find({tripduration:{$gt:2000}})// Cambia el tipo de usuario a 'Subscriber' de todas los documentos que tripduration mayores o iguales a 2600use("sample_training")db.trips.updateMany(// query{tripduration:{$gte:2600}},// update with operations{$set:{usertype:"Subscriber"}})// Muestra todos los documentos con tripduration mayor o igual a 2600use("sample_training")db.trips.find({tripduration:{$gte:2600}})
// Resta 10 a todas las coordenadas de inicio de los documentos con tripduration menor a 3000 y usertype igual a "Costumer"use("sample_training")db.trips.updateMany(// query{$and:[{tripduration:{$lt:3000}},{usertype:"Costumer"}]},// update with operations{$inc:{"start station location.coordinates.0":-10,"start station location.coordinates.1":-10}})// Muestra todos los documentos con tripduration menor a 3000use("sample_training")db.trips.find({$and:[{tripduration:{$lt:3000}},{usertype:"Costumer"}]})// Elimina el campo 'start station location' con tripduration menores a 3000 y con usertype igual a 'Costumer' (solo porque puedo :v)use("sample_training")db.trips.updateMany(// query{$and:[{tripduration:{$lt:3000}},{usertype:"Costumer"}]},// update with operations{$unset:{"start station location":1}})use("sample_training")db.trips.find({$and:[{tripduration:{$lt:3000}},{usertype:"Costumer"}]})// Agrega el campo 'start station location' con tripduration menores a 3000 y con usertype igual a 'Costumer' (ya me arrepentí :'v)use("sample_training")db.trips.updateMany(// query{$and:[{tripduration:{$lt:3000}},{usertype:"Costumer"}]},// update with operations{$set:{"start station location":{type:"Point",coordinates:[-73.98990025,40.71427487]}}})use("sample_training")db.trips.find({$and:[{tripduration:{$lt:3000}},{usertype:"Costumer"}]})// Suma 10 a todas las coordenadas de fin de los documentos con tripduration menor o igual a 2000 y usertype igual a "Subscriber"use("sample_training")db.trips.updateMany(// query{$and:[{tripduration:{$lte:2000}},{usertype:"Subscriber"}]},// update with operations{$inc:{"start station location.coordinates.0":10,"start station location.coordinates.1":10}})// Muestra todos los documentos con tripduration menor o igual a 2000use("sample_training")db.trips.find({$and:[{tripduration:{$lte:2000}},{usertype:"Subscriber"}]})
Mi aporte:
dataset:
use("football");db.scorers.insertMany([{jugador:"Lionel Messi",equipo:"Inter Miami",goles:25,torneo:"MLS",temporada:"2023-2024"},{jugador:"Robert Lewandowski",equipo:"Barcelona",goles:27,torneo:"La Liga",temporada:"2023-2024"},{jugador:"Cristiano Ronaldo",equipo:"Al Nassar",goles:31,torneo:"Liga Arabe",temporada:"2023-2024"},{jugador:"Erling Haaland",equipo:"Manchester City",goles:36,torneo:"Premier League",temporada:"2023-2024"},{jugador:"Kylian Mbappé",equipo:"PSG",goles:29,torneo:"La Liga",temporada:"2023-2024"},{jugador:"Neymar Jr",equipo:"Al Hilal",goles:23,torneo:"Liga Arabe",temporada:"2023-2024"},{jugador:"Mohamed Salah",equipo:"Liverpool",goles:28,torneo:"Premier League",temporada:"2023-2024"},{jugador:"Radamel Falcao",equipo:"Rayo Vallecano",goles:18,torneo:"La Liga",temporada:"2023-2024"},{jugador:"Harry Kane",equipo:"Bayern Munich",goles:26,torneo:"Bundesliga",temporada:"2023-2024"},])```script:
```js
// jugadores con goles mayor a 25db.scorers.find({"goles":{$gt:25}})// jugadores con goles mayor o igual a 28db.scorers.find({"goles":{$gt:28}})// jugadores con goles mayor o igual a 15 y menor o igual a 22db.scorers.find({"goles":{$gte:15,$lte:22}})
use("platzi_store")/*
Actualiza todos los documentos donde el sensor no es igual a A001 y date es mayor o igual a 2022-01-02.
Crea un nuevo campo processed con valor true y agrega el valor 5 al array readings.
*/db.iot.updateMany(// query{sensor:{$ne:"A001"},date:{$gte:"2022-01-02"}},// update{$set:{processed:true},$push:{readings:5}})