Saltar al contenido principal

Cómo utilizar updateMany() en MongoDB para modificar varios documentos

Aprende a utilizar y optimizar el rendimiento del operador updateMany() en MongoDB para actualizar varios documentos en una sola operación.
Actualizado 13 jun 2025  · 4 min de lectura

Cuando se trata de MongoDB, puede haber situaciones en las que quieras actualizar varios documentos con una sola operación. Aunque podrías recorrer los documentos en bucle y actualizarlos individualmente, updateMany ofrece una solución más rápida y eficaz.

En este breve tutorial, aprenderemos a utilizar el operador updateMany en MongoDB y a optimizar las consultas para conseguir el mejor rendimiento posible.

Para construir una base sólida en las capacidades de manejo de datos de MongoDB utilizando Python, considera explorar el curso sobre Introducción a MongoDB en Python.

Ejemplo práctico de actualización de varios documentos MongoDB

Para ilustrar este concepto, vamos a utilizar un ejemplo práctico en el que puede que quieras actualizar más de un documento a la vez.

Toma los siguientes datos como base para el ejemplo:

[
    { "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
    { "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") },
    { "name": "Tony Kim", "title": "Alliance Czar", "salary": 80000, "last_raise_date": new Date("2025-02-01") },
];

En el JSON anterior, tenemos tres empleados en una empresa ficticia. La empresa quiere dar a todos un aumento de la retribución si no han recibido ningún ajuste salarial durante cierto tiempo.

Para actualizar a todos los que cumplen los requisitos, podemos utilizar el operador updateMany de MongoDB. Para llevar a cabo nuestra tarea, podríamos acabar con una declaración parecida a la siguiente:

db.employees.updateMany(
    {
        "last_raise_date": {
            "$lte": new Date("2024-01-01")
        }
    },
    {
        "$mul": { "salary": 1.06 },
        "$set": { "last_raise_date": new Date() }
    }
);

Entonces, ¿qué hace la operación anterior de updateMany?

Dando un paso atrás, el operador updateMany toma dos parámetros con un tercer parámetro opcional. 

  • El primer parámetro es un objeto que representa los datos que queremos filtrar. 
  • El segundo parámetro son los cambios que queremos hacer en los resultados encontrados en el filtro. 
  • El tercer parámetro opcional podría ser { “upsert”: true }, que insertaría un documento si no hubiera coincidencias.

Teniendo esto en cuenta, primero filtramos todos los documentos en los que el last_raise_date sea anterior a "2024-01-01". Volviendo a nuestro conjunto de datos básico, sabemos que dos de los tres documentos coinciden:

[
    { "name": "Nic Raboy", "title": "Master of Shenanigans", "salary": 50000, "last_raise_date": new Date("2013-06-01") },
    { "name": "Megan Grant", "title": "Word Wrangler", "salary": 125000, "last_raise_date": new Date("2020-12-01") }
];

Se realizarán dos cambios diferentes en los documentos filtrados en función del parámetro de criterios de cambio.

"$mul": { "salary": 1.06 },

En primer lugar, vamos a utilizar el operador $mul para multiplicar uno de nuestros campos por un valor. En nuestro ejemplo, queremos dar a cada empleado que cumpla los requisitos un aumento salarial del 6%. Esto significa que simplemente multiplicamos el valor actual del campo por 1,06.

Para ayudarnos a documentar los ajustes salariales y al mismo tiempo evitar aumentos accidentales en el futuro, queremos actualizar la last_raise_date a la fecha actual:

"$set": { "last_raise_date": new Date() }

Si volviéramos a ejecutar nuestra operación updateMany, no pasaría nada porque el last_raise_date encontrado en el filtro ya no coincidiría con ninguno de nuestros tres documentos.

Lo anterior es sólo un ejemplo, pero tus criterios de filtrado podrían ser mucho más complejos y, del mismo modo, lo que piensas cambiar también podría serlo, dependiendo de tu caso de uso.

Aumenta el rendimiento de tu actualización con un índice MongoDB

En nuestro ejemplo, trabajábamos con tres documentos pequeños. Prácticamente sea cual sea la operación que lancemos a nuestra colección, será rápida porque no trabajaremos con mucho. Sin embargo, piensa en una aplicación de producción en la que trabajes con millones de documentos o ejecutes con frecuencia la operación de actualización.

Si intentáramos utilizar el operador updateMany en millones de documentos, podría llevarnos algún tiempo, a menos que tuviéramos un índice adecuado establecido para nuestros criterios de filtrado.

Para crear un índice para nuestro ejemplo, podemos ejecutar algo así:

db.employees.createIndex({ "last_raise_date": 1 });

Puedes validar que la operación updateMany está utilizando nuestro índice ejecutando lo siguiente:

db.runCommand({
    "explain": {
        "update": "employees",
        "updates": [
            {
                "q": { 
                    "last_raise_date": { 
                        "$lte": new Date("2024-01-01") 
                    }
                },
                "u": {
                    "$mul": { "salary": 1.06 },
                    "$set": { "last_raise_date": new Date() }
                }
            }
        ]
    },
    "verbosity": "allPlansExecution"
});

En los resultados, si el inputStage es "IXSCAN", entonces estás utilizando un índice y maximizando el rendimiento de tu updateMany. Si el inputStage es "COLLSCAN", entonces no estás utilizando un índice y puede que tengas que replantearte cómo estás creando tu índice en función de tus criterios de filtrado.

Para aclarar cualquier confusión, estamos utilizando runCommand para perfilar nuestra operación de actualización de varios documentos. Si no necesitas ninguna información del perfilador, quédate con la operación updateMany, mucho más sencilla y elegante.

Conclusión

Actualizar varios documentos en una sola operación en MongoDB no es una tarea difícil, como se ha visto a lo largo del tutorial. 

Utilizando el operador updateMany, podemos definir un criterio de filtro para cotejar nuestros documentos y, a continuación, un criterio de cambio con una lista de cambios a realizar. Esta operación de updateMany puede optimizarse aún más asegurándote de que tienes un índice adecuado que se ajuste a tus criterios de filtrado.

Si eres nuevo en las bases de datos no relacionales, el curso Introducción a NoSQL ofrece una útil visión general de conceptos como los almacenes de documentos.

Conviértete en Ingeniero de Datos

Demuestra tus habilidades como ingeniero de datos preparado para el trabajo.
Acelerar mi carrera en el sector de los datos

Preguntas frecuentes

¿Cuál es la diferencia entre updateOne y updateMany en MongoDB?

 updateOne modifica el primer documento coincidente, mientras que updateMany actualiza todos los documentos que cumplen los criterios del filtro. Elige en función del alcance deseado del cambio.

¿Se puede utilizar updateMany con upsert en MongoDB?

Sí, añadiendo { upsert: true } como tercer argumento se insertará un nuevo documento si no se encuentra ninguna coincidencia. Sin embargo, se utiliza más comúnmente con updateOne.

¿Cuáles son algunos casos de uso común de updateMany?

Suele utilizarse para actualizaciones por lotes, como ajustar precios, modificar estados de usuario o limpiar campos obsoletos en grandes conjuntos de datos.

¿Devuelve updateMany algún dato de resultado?

Sí, devuelve un objeto con información como matchedCount y modifiedCount, que indica cuántos documentos se han cotejado y actualizado.

¿Qué ocurre si ningún documento coincide con el filtro en updateMany?

Si ningún documento coincide y no se utiliza upsert, la operación finaliza sin cambios. No se produce ningún error.

¿Es updateMany atómico en MongoDB?

No, no es atómico entre varios documentos. Cada actualización de documento es atómica por sí sola, pero no colectivamente.

¿Cómo puedo comprobar el rendimiento de las operaciones updateMany?

Utiliza los métodos explain() o runCommand({ explain: ... }) para ver si tu consulta utiliza un índice o realiza un escaneo de colecciones.

¿Puedo encadenar varios operadores de actualización en updateMany?

Sí, MongoDB admite la combinación de operadores como $set, $inc, $mul, etc., en una sola llamada a updateMany.

¿Qué impacto tienen los índices en las operaciones updateMany?

Los índices pueden mejorar drásticamente el rendimiento al reducir el número de documentos escaneados durante el filtrado.

¿Cómo deshago una operación updateMany accidental?

Tendrías que restaurar desde una copia de seguridad o un registro, ya que MongoDB no dispone de reversión integrada para updateMany. Prueba siempre en la fase de ensayo y haz primero una copia de seguridad de los datos de producción.


Nic Raboy's photo
Author
Nic Raboy

Nic Raboy es Jefe de Relaciones con Desarrolladores en MongoDB, donde dirige un equipo de programadores de Python, Java, C# y PHP que crean contenido impresionante para ayudar a los programadores a incluir con éxito MongoDB en sus proyectos. Tiene experiencia con Golang y JavaScript y escribe a menudo sobre muchas de sus aventuras de desarrollo.

Temas

¡Aprende más sobre MongoDB y las bases de datos con estos cursos!

Curso

Introduction to Databases in Python

4 h
98.7K
In this course, you'll learn the basics of relational databases and how to interact with them.
Ver detallesRight Arrow
Comienza el curso
Ver másRight Arrow
Relacionado

blog

Contratos de datos desmitificados: Todo lo que necesitas saber

Lograr la escalabilidad en los sistemas de datos distribuidos y reducir los errores.
Mike Shakhomirov's photo

Mike Shakhomirov

11 min

Tutorial

Multiprocesamiento en Python: Guía de hilos y procesos

Aprende a gestionar hilos y procesos con el módulo de multiprocesamiento de Python. Descubre las técnicas clave de la programación paralela. Mejora la eficacia de tu código con ejemplos.
Kurtis Pykes 's photo

Kurtis Pykes

7 min

Tutorial

Seleccionar varias columnas en SQL

Aprende a seleccionar fácilmente varias columnas de una tabla de base de datos en SQL, o a seleccionar todas las columnas de una tabla en una simple consulta.
DataCamp Team's photo

DataCamp Team

3 min

Tutorial

Cómo utilizar GROUP BY y HAVING en SQL

Una guía intuitiva para descubrir los dos comandos SQL más populares para agregar filas de tu conjunto de datos
Eugenia Anello's photo

Eugenia Anello

6 min

Tutorial

Tutorial de módulos de Python: Importarlos, escribirlos y utilizarlos

Aprende a crear e importar módulos de Python. ¡Descubre las mejores prácticas, ejemplos y consejos para escribir código Python reutilizable, organizado y eficiente!

Nishant Kumar

8 min

Tutorial

Tutorial sobre la ejecución de scripts de Python en Power BI

Descubre las distintas formas de utilizar Python para optimizar el análisis, la visualización y el modelado de datos en Power BI.
Joleen Bothma's photo

Joleen Bothma

9 min

Ver másVer más