¿Cómo realizar actualizaciones en múltiples documentos en MongoDB?
Actualizar una gran cantidad de documentos en una base de datos es una tarea crucial que puede ser optimizada utilizando los métodos adecuados. MongoDB provee herramientas poderosas como updateMany para ejecutar actualizaciones a escala. Este artículo desglosa cómo se puede aplicar updateMany para actualizar documentos en función de condiciones específicas, asegurando eficiencia y precisión.
¿Qué es updateMany y cómo se usa?
El método updateMany en MongoDB permite realizar actualizaciones a varios documentos que cumplan con un determinado criterio de búsqueda. Este método es especialmente útil para modificar campos o añadir nuevos elementos en múltiples registros de una colección de manera simultánea.
Ejemplo de uso básico:
Supongamos que queremos incrementar la población en mil de todos los documentos donde la ciudad sea Cleveland:
En este ejemplo, un nuevo campo myAttribute con el valor "hola" será añadido a los documentos que cumplan con el criterio.
¿Cómo renombrar y eliminar atributos?
MongoDB también ofrece operaciones para renombrar y eliminar atributos de documentos. Esto es útil cuando queremos limpiar o organizar nuestros datos sin alterar el contenido real.
Renombrar un atributo:
Utiliza $rename para cambiar el nombre de un campo sin alterar su contenido:
Este comando elimina el campo myData de los documentos que cumplan con el criterio.
¿Por qué utilizar updateMany y estos operadores?
El uso de updateMany junto con operadores como $set, $rename y $unset proporciona:
Eficiencia al aplicar cambios a múltiples documentos de manera simultánea, evitando actualizaciones individuales.
Consistencia en los datos al asegurar que todas las modificaciones se apliquen bajo las mismas condiciones y parámetros.
Flexibilidad para adaptar y organizar los datos a los requisitos cambiantes del sistema o negocio.
MongoDB, a través de updateMany, facilita la gestión masiva de datos, permitiendo a los desarrolladores mantener la integridad de la base de datos en procesos de cambios extensos. Te animamos a seguir explorando y utilizando estas operaciones en tu flujo de trabajo diario, impulsando así tus proyectos hacia mayores niveles de optimización y rendimiento. ¡El conocimiento es poder, sigue aprendiendo y innovando!
$inc: Incrementa el valor de un atributo numérico en una cantidad específica.
|
$mul: Multiplica el valor de un atributo numérico por un factor específico.
|
$rename: Cambia el nombre de un atributo.
|
$set: Asigna un valor específico a un atributo.
|
$unset: Elimina un atributo de un documento.
|
$min: Actualiza el valor de un atributo con el valor mínimo especificado, sólo si el valor actual es mayor que el valor especificado.
|
$max: Actualiza el valor de un atributo con el valor máximo especificado, sólo si el valor actual es menor que el valor especificado.
|
$currentDate: Establece el valor de un atributo como la fecha y hora actual.
|
$addToSet: Añade un valor a un atributo de tipo conjunto (array), sólo si el valor no existe en el conjunto.
|
$pop: Elimina el primer o último elemento de un atributo de tipo conjunto (array).
|
$pull: Elimina un valor específico de un atributo de tipo conjunto (array).
|
$push: Añade un valor a un atributo de tipo conjunto (array).
|
$pullAll: Elimina varios valores específicos de un atributo de tipo conjunto (array).
Gracias por compartirlo. Pero que confusión los comandos que se parecen a otros como en terminal o git, aquí con la distinción del $
Buen aporte !! 👏👏
Para comentar líneas de código en VS Code pueden utilizar el siguiente atajo
Seleccionan las líneas a comentar
Presionar Ctrl + K + C
Para descomentar las líneas
Seleccionar las líneas a descomentar
Presionar Ctrl + K + U
O también pueden usar como atajo para comentar o descomentar:
Ctrl + }
O también pueden usar como atajo para comentar o descomentar:
Ctrl + Shift + 7
Más operadores:
$set: Permite agregar o modificar un atributo.
$rename: Podemos renombrar un atributo sin necesidad de meterme con los valores.
$unset: Eliminar algun atributo.
Para que no tengan que comentar las líneas de código que no van a usar en ese mismo momento, recuerden que, en visual studio code, pueden seleccionar varias líneas de código usando la tecla alt.
Primero, con su cursor hacen click y seleccionan el bloque de código que quieren ejecutar, luego, van hasta la parte de arriba, donde dice use("sample_training"), mantienen la tecla alt y seleccionan esa línea de código.
Luego pueden darle al botón de run, y mongodb ejecutará solo el código que ustedes seleccionaron.
Gracias por el consejo!
link a la documentacion con los operadores de actualizacion
Como puedo descargar la base de datos de prueba de mongo altas en mi base de datos local en docker?
si tu contenedor tienes el puerto configurado puede acceder a internet para poder descargar la base de datos, desde tu mongosh
En tu docker corriendo el siguiente comando haces el dump de la base de datos remota:
Es muy importante que en el uri hay que indicar el nombre de la base de datos, en este ejemplo descargo el sample de airbnb. Además, esto me generará todos los ficheros en una carpeta llamada 'sample_airbnb' en la misma carpeta donde estoy lanzando el comando. Para hacer el export del backup:
En el caso de utilizar el puerto por defecto no hay que indicar el parámetro --port. En caso de querer utilizar el mismo nombre de base de datos que en el backup, no hace falta indicar el parámetro -d. El parámetro --drop elimina todas las colecciones que existen en la base de datos antes de cargar los nuevos documentos. Ejemplo:
Para comentar o des-comentar varias líneas en VSCode como lo hace el profesor, utilizas: Shift + ALT + A
use("sample_training");db.zips.updateMany(//query has two conditions, population $gt is greater than{city:"CLEVELAND",pop:{$gt:50000}},{$inc:{pop:20,},$set:{//add new attributemy_description:"This state is bigger",},});db.zips.updateMany({city:"CLEVELAND",pop:{$gt:50000}},{$rename:{//rename this attributemy_description:"description",},});db.zips.updateMany({city:"CLEVELAND",pop:{$gt:50000}},{$unset:{// delete this attributedescription:"",},});db.zips.find({city:"CLEVELAND",pop:{$gt:50000}});
Pero parece que el $rename creó otro atributo en lugar de sobreescribir el nombre.., no?
Hola Miguel
No, yo ejecute el comando $rename y efectivamente renombra no crea otro campo adicional
En el caso del profesor si, a mi si me funciono
Si yo ejecuto un update y quiero hacer rollback es posible o ya queda en firme?
nico bune dia porfa ayudame como realizar la conexion de mongo Atlas con php simple o javascript basico
Profe es posible hacer la copia de una campo dentro de una colletion
ejemplo:
{id:1,
Fecha:"Dato a copiar"
Dato:{
dato:"Fecha copiada"}
Para esto hace falta utilizar el aggregation pipeline, tal y como se explica en esta entrada del foro mongodb
Este apareció cuando se ejecuto el set agregando "myAttr: 'hola'".
Seguramente se trate de un corte de cámara o algo por el estilo
Muy buena clase
Cambiaron el formato y no veo donde esta la base de datos para ensayar los codigos
En VS Code al hacer un find, solo nos muestra un numero de documentos. Como podemos verlos todos? hay alguna forma de paginar o solo nos va a mostrar una pequeña muestra?
saludos
Querys de casos de uso de estos operadores
db.test2.updateMany({age:{$gt:18}},{$set:{adulto:true}})db.libros.updateOne({_id:{$eq:ObjectId('64ed1a9946f812aa794d176b')}},{$unset:{id:''}})db.test2.updateOne({_id:{$eq:ObjectId('64ed1a9946f812aa794d176b')}},{$unset:{id:''}})db.test2.updateOne({$and:[{age:{$lt:18}},{name:{$exists:true}}]},{$set:{adulto:false}})db.test2.updateMany({$and:[{age:{$lt:18}},{name:{$exists:true}}]},{$set:{adulto:false}})db.test2.updateOne({_id:{ $in:[ObjectId('64ed1cd746f812aa794d176f'),ObjectId('64ed1cb546f812aa794d176e')]}},{$set:{name:'update in'}})db.test2.updateMany({_id:{ $in:[ObjectId('64ed1cd746f812aa794d176f'),ObjectId('64ed1cb546f812aa794d176e')]}},{$set:{name:'update in'}})db.test2.updateOne({$and:[{adulto:{$ne:true}},{full_name:{$eq:'update in'}}]},[{$set:{ref:{$concat:['$_id','$age']}}}])// para incrementar valores de un campo $inc, si no existe el campo lo crea, pero si debe existir por el parametro de busquedaddb.products.updateOne({_id:4},{$inc:{price:50}}){"_id":4,"name":"Prodcut 4","price":450}ahora _id:4, el campo price quedaria en 500// esta accion evita que se pare la insercion de los documentos, si alguno contiene errordb.products.insertMany([...],{ordered:false}))