Pular para o conteúdo principal

Como usar updateMany() no MongoDB para modificar vários documentos

Saiba como usar e otimizar o desempenho do operador updateMany() no MongoDB para atualizar vários documentos em uma única operação.
Atualizado 13 de jun. de 2025  · 4 min lido

Quando se trata do MongoDB, pode haver cenários em que você queira atualizar vários documentos com uma única operação. Embora você possa percorrer os documentos e atualizá-los individualmente, o site updateMany oferece uma solução mais rápida e eficiente.

Neste breve tutorial, você aprenderá a usar o operador updateMany no MongoDB e a otimizar as consultas para obter o melhor desempenho possível.

Para criar uma base sólida nos recursos de manipulação de dados do MongoDB usando Python, considere explorar o curso Introdução ao MongoDB em Python.

Exemplo prático de atualização de vários documentos do MongoDB

Para ilustrar esse conceito, vamos usar um exemplo prático em que você pode querer atualizar mais de um documento ao mesmo tempo.

Tome os dados a seguir como base para o exemplo:

[
    { "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") },
];

No JSON acima, temos três funcionários em uma empresa fictícia. A empresa quer dar a todos um aumento na remuneração se não tiverem recebido nenhum ajuste salarial por um determinado período.

Para atualizar todos os que se qualificam, podemos usar o operador updateMany no MongoDB. Para realizar nossa tarefa, podemos acabar com uma declaração parecida com a seguinte:

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

Então, o que a operação updateMany acima faz?

Dando um passo atrás, o operador updateMany recebe dois parâmetros com um terceiro parâmetro opcional. 

  • O primeiro parâmetro é um objeto que representa os dados que você deseja filtrar. 
  • O segundo parâmetro são as alterações que queremos fazer nos resultados encontrados no filtro. 
  • O terceiro parâmetro opcional poderia ser { “upsert”: true }, que inseriria um documento se não houvesse correspondências.

Com isso em mente, primeiro filtramos todos os documentos em que o endereço last_raise_date é anterior a "2024-01-01". Analisando nosso conjunto de dados muito básico, sabemos que temos dois dos três documentos correspondentes:

[
    { "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") }
];

Duas alterações diferentes serão feitas nos documentos filtrados com base no parâmetro de critérios de alteração.

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

Primeiro, estamos usando o operador $mul para multiplicar um de nossos campos por um valor. Em nosso exemplo, queremos dar a cada funcionário qualificado um aumento de 6% no salário. Isso significa que estamos simplesmente multiplicando o valor atual do campo por 1,06.

Para nos ajudar a documentar os ajustes salariais e, ao mesmo tempo, evitar aumentos acidentais no futuro, queremos atualizar o site last_raise_date para a data atual:

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

Se executássemos nossa operação updateMany novamente, nada aconteceria porque o last_raise_date encontrado no filtro não corresponderia mais a nenhum de nossos três documentos.

O exemplo acima é apenas um exemplo, mas seus critérios de filtro podem ser muito mais complexos e, da mesma forma, o que você planeja alterar também pode ser mais complexo, dependendo do seu caso de uso.

Aumente o desempenho de sua atualização com um índice do MongoDB

Em nosso exemplo, estávamos trabalhando com três documentos pequenos. Praticamente qualquer que seja a operação que lançarmos em nossa coleção, ela será rápida porque não estaremos trabalhando com muita coisa. No entanto, pense em um aplicativo de produção em que você trabalha com milhões de documentos ou executa a operação de atualização com frequência.

Se tentássemos usar o operador updateMany em milhões de documentos, isso poderia levar algum tempo, a menos que tivéssemos um índice adequado estabelecido para nossos critérios de filtro.

Para criar um índice para o nosso exemplo, podemos executar algo como isto:

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

Você pode validar que a operação updateMany está usando nosso índice executando o seguinte:

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"
});

Nos resultados, se o inputStage for "IXSCAN", você estará usando um índice e maximizando o desempenho do updateMany. Se o endereço inputStage for "COLLSCAN", então você não está usando um índice e talvez precise repensar como está criando o índice com base nos critérios do filtro.

Para esclarecer qualquer confusão, estamos usando runCommand acima para traçar o perfil de nossa operação de atualização de vários documentos. Se você não precisar de nenhuma informação de perfil, use a operação muito mais simples e elegante do updateMany.

Conclusão

Atualizar vários documentos em uma única operação no MongoDB não é uma tarefa difícil, conforme visto ao longo do tutorial. 

Usando o operador updateMany, podemos definir um critério de filtro para comparar nossos documentos e, em seguida, um critério de alteração com uma lista de alterações a serem feitas. Essa operação updateMany pode ser otimizada ainda mais se você tiver um índice adequado que se encaixe nos critérios do filtro.

Se você não tem experiência com bancos de dados não relacionais, o curso Introduction to NoSQL oferece uma visão geral útil de conceitos como armazenamentos de documentos.

Torne-se um engenheiro de dados

Comprove suas habilidades como engenheiro de dados pronto para o trabalho.
Acelerar minha carreira de dados

Perguntas frequentes

Qual é a diferença entre updateOne e updateMany no MongoDB?

 updateOne modifica o primeiro documento correspondente, enquanto updateMany atualiza todos os documentos que atendem aos critérios do filtro. Escolha com base no escopo de mudança desejado.

O updateMany pode ser usado com upsert no MongoDB?

Sim, ao adicionar { upsert: true } como o terceiro argumento, você inserirá um novo documento se nenhuma correspondência for encontrada. No entanto, é mais comumente usado com updateOne.

Quais são alguns casos de uso comuns do updateMany?

Geralmente é usado para atualizações em lote, como ajuste de preços, modificação de status de usuário ou limpeza de campos desatualizados em grandes conjuntos de dados.

O updateMany retorna algum dado de resultado?

Sim, ele retorna um objeto com informações como matchedCount e modifiedCount, indicando quantos documentos foram combinados e atualizados.

O que acontecerá se nenhum documento corresponder ao filtro em updateMany?

Se nenhum documento corresponder e upsert não for usado, a operação será concluída sem alterações. Nenhum erro é lançado.

O updateMany é atômico no MongoDB?

Não, ele não é atômico em vários documentos. Cada atualização de documento é atômica por si só, mas não coletivamente.

Como posso testar o desempenho das operações updateMany?

Use os métodos explain() ou runCommand({ explain: ... }) para ver se sua consulta usa um índice ou executa uma varredura de coleção.

Posso encadear vários operadores de atualização em updateMany?

Sim, o MongoDB suporta a combinação de operadores como $set, $inc, $mul, etc., em uma única chamada updateMany.

Qual é o impacto dos índices nas operações updateMany?

Os índices podem melhorar drasticamente o desempenho, reduzindo o número de documentos digitalizados durante a filtragem.

Como faço para desfazer uma operação updateMany acidental?

Você precisaria restaurar a partir de um backup ou registro, pois o MongoDB não tem reversão integrada para updateMany. Sempre teste na preparação e faça backup dos dados de produção primeiro.


Nic Raboy's photo
Author
Nic Raboy

Nic Raboy é Líder de Relações com Desenvolvedores na MongoDB, onde lidera uma equipe de desenvolvedores Python, Java, C# e PHP que criam conteúdo incrível para ajudar os desenvolvedores a serem bem-sucedidos na inclusão do MongoDB em seus projetos. Ele tem experiência com Golang e JavaScript e escreve com frequência sobre muitas de suas aventuras de desenvolvimento.

Tópicos

Saiba mais sobre o MongoDB e bancos de dados com estes 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 detalhesRight Arrow
Iniciar curso
Ver maisRight Arrow
Relacionado

blog

Bancos de dados NoSQL: O que todo cientista de dados precisa saber

Descubra para que servem os bancos de dados NoSQL, por que os cientistas de dados os utilizam e uma lista dos melhores bancos de dados NoSQL disponíveis.
Zoumana Keita 's photo

Zoumana Keita

12 min

blog

Contratos de dados desmistificados: Tudo o que você precisa saber

Obtendo escalabilidade em sistemas de dados distribuídos e reduzindo erros.
Mike Shakhomirov's photo

Mike Shakhomirov

11 min

Tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

3 min

Tutorial

Como usar GROUP BY e HAVING no SQL

Um guia intuitivo para você descobrir os dois comandos SQL mais populares para agregar linhas do seu conjunto de dados
Eugenia Anello's photo

Eugenia Anello

6 min

Tutorial

Tutorial do Insert Into SQL

A instrução "INSERT INTO" do SQL pode ser usada para adicionar linhas de dados a uma tabela no banco de dados.
DataCamp Team's photo

DataCamp Team

3 min

Tutorial

Como usar um alias SQL para simplificar suas consultas

Explore como o uso de um alias SQL simplifica os nomes de colunas e tabelas. Saiba por que usar um alias SQL é fundamental para melhorar a legibilidade e gerenciar uniões complexas.
Allan Ouko's photo

Allan Ouko

9 min

Ver maisVer mais