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