Curso
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
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 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.