MONGODB UPDATE - Atualizar Documentos no MongoDB
O que é este Node?
O MONGODB UPDATE é o node responsável por atualizar um ou múltiplos documentos em uma coleção MongoDB usando uma query de filtro e um objeto de atualização.
Por que este Node existe?
Modificar dados existentes é uma operação fundamental em qualquer aplicação. O MONGODB UPDATE existe para:
- Atualizar múltiplos documentos: Modificar vários registros que atendem a um critério
- Modificar campos específicos: Alterar apenas os campos necessários, preservando outros
- Atualizar em lote: Aplicar mudanças a todos os documentos que correspondem à query
- Retornar estatísticas: Informar quantos documentos foram afetados
Como funciona internamente?
Quando o MONGODB UPDATE é executado, o sistema:
- Valida configuração: Verifica se as credenciais MongoDB foram fornecidas
- Estabelece conexão: Conecta ao servidor MongoDB usando as credenciais
- Seleciona coleção: Acessa a coleção especificada no banco de dados
- Processa query e update: Substitui variáveis em ambos os objetos
- Converte _id: Transforma strings de ObjectId quando necessário
- Executa updateMany: Atualiza TODOS os documentos que atendem à query
- Usa $set automático: Envolve o update em operador $set
- Retorna estatísticas: Informa matchedCount, modifiedCount e acknowledged
- Fecha conexão: Encerra a conexão com MongoDB
Código interno (mongodb.executor.ts:169-188):
private async updateDocument(
db: Db,
collectionName: string,
query: any,
update: any,
context: ExecutionContext,
): Promise<any> {
const replacedQuery = this.replaceObjectVariables(query, context.variables);
const replacedUpdate = this.replaceObjectVariables(update, context.variables);
const parsedQuery = this.parseMongoQuery(replacedQuery);
const collection = db.collection(collectionName);
const result = await collection.updateMany(parsedQuery, { $set: replacedUpdate });
return {
matchedCount: result.matchedCount,
modifiedCount: result.modifiedCount,
acknowledged: result.acknowledged,
};
}
Quando você DEVE usar este Node?
Use MONGODB UPDATE sempre que precisar modificar documentos existentes:
Casos de uso
- Atualizar status: "Marcar todos os pedidos como 'enviado'"
- Modificar preços: "Aumentar preço de todos produtos da categoria X em 10%"
- Atualizar dados: "Corrigir campo telefone do cliente"
- Mudanças em lote: "Ativar todos os usuários que estavam inativos"
Quando NÃO usar MONGODB UPDATE
- Atualizar e buscar resultado: Use MONGODB FIND_ONE_AND_UPDATE para ver o documento atualizado
- Atualizar apenas 1 documento: Considere FIND_ONE_AND_UPDATE para mais controle
- Substituir documento completo: Use MONGODB FIND_ONE_AND_REPLACE para trocar tudo
- Criar se não existir: Use FIND_ONE_AND_UPDATE com upsert:true
Parâmetros Detalhados
operation (string, obrigatório)
O que é: Define qual operação MongoDB será executada. Para atualizar documentos, use "update".
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste MongoDB Update - Operation",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar Produto",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": { "_id": "507f1f77bcf86cd799439011" },
"update": { "preco": 2499.90 },
"responseVariable": "resultado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Atualizado! {{resultado.modifiedCount}} documento(s)"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow com um _id válido 2. Espere: "✅ Atualizado! 1 documento(s)"
config (object, obrigatório)
O que é: Objeto contendo as credenciais e configurações de conexão com o MongoDB.
Estrutura:
- connectionString (string): String de conexão completa MongoDB
- OU host, port, user, password: Configuração individual
- database (string, obrigatório): Nome do banco de dados
Flow completo para testar:
{
"name": "Teste MongoDB Update - Config",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar com Auth",
"operation": "update",
"config": {
"host": "localhost",
"port": 27017,
"database": "crm",
"user": "admin",
"password": "senha123"
},
"collection": "clientes",
"query": { "email": "joao@example.com" },
"update": { "telefone": "11999998888" },
"responseVariable": "resultado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Telefone atualizado! {{resultado.modifiedCount}} cliente(s)"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Configure MongoDB com autenticação 2. Execute o flow 3. Espere: "Telefone atualizado! X cliente(s)"
collection (string, obrigatório)
O que é: Nome da coleção MongoDB onde os documentos serão atualizados.
Flow completo para testar:
{
"name": "Teste MongoDB Update - Collection",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar na Coleção",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "ecommerce"
},
"collection": "pedidos",
"query": { "status": "pendente" },
"update": { "status": "processando" },
"responseVariable": "resultado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Resultado",
"parameters": {
"message": "{{resultado.modifiedCount}} pedidos atualizados"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "X pedidos atualizados"
query (object, obrigatório)
O que é: Filtro para selecionar quais documentos serão atualizados. Suporta todos os operadores MongoDB.
Flow completo para testar:
{
"name": "Teste MongoDB Update - Query",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar Filtrados",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": {
"categoria": "eletronicos",
"estoque": { "$lt": 5 }
},
"update": {
"emPromocao": true,
"desconto": 20
},
"responseVariable": "resultado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ {{resultado.modifiedCount}} produtos em promoção por baixo estoque"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "✅ X produtos em promoção por baixo estoque"
update (object, obrigatório)
O que é: Objeto contendo os campos e valores a serem atualizados. Automaticamente usa operador $set.
Flow completo para testar:
{
"name": "Teste MongoDB Update - Update Object",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar Múltiplos Campos",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "crm"
},
"collection": "clientes",
"query": { "_id": "507f1f77bcf86cd799439011" },
"update": {
"nome": "João Silva Santos",
"telefone": "11987654321",
"endereco": {
"rua": "Rua Nova, 456",
"cidade": "São Paulo"
},
"dataAtualizacao": "2024-01-15T14:30:00.000Z"
},
"responseVariable": "resultado"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Dados do cliente atualizados"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow com _id válido 2. Espere: "✅ Dados do cliente atualizados"
responseVariable (string, opcional)
O que é: Nome da variável onde o resultado da atualização será armazenado (contém matchedCount, modifiedCount, acknowledged).
Padrão: Se não especificado, resultado não é armazenado
Flow completo para testar:
{
"name": "Teste MongoDB Update - Response Variable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Atualizar e Salvar Stats",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": { "categoria": "livros" },
"update": { "frete": "gratis" },
"responseVariable": "stats"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Estatísticas",
"parameters": {
"message": "📊 Estatísticas:\n✅ Encontrados: {{stats.matchedCount}}\n🔄 Modificados: {{stats.modifiedCount}}\n📝 Confirmado: {{stats.acknowledged}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "📊 Estatísticas: ✅ Encontrados: X 🔄 Modificados: Y ..."
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Tipo de operação MongoDB ("update") |
| config | object | Sim | Configuração de conexão MongoDB |
| collection | string | Sim | Nome da coleção |
| query | object | Sim | Filtro para selecionar documentos |
| update | object | Sim | Campos a serem atualizados |
| responseVariable | string | Não | Variável para armazenar estatísticas |
Exemplo 1: Atualizar Status de Pedidos
Objetivo: Marcar todos os pedidos pendentes como "processando"
JSON para Importar
{
"name": "Atualizar Status de Pedidos",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_start",
"type": "message",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Confirmar Ação",
"parameters": {
"message": "🔄 Processando pedidos pendentes..."
}
}
},
{
"id": "mongodb_update",
"type": "mongodb",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Atualizar Status",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "ecommerce"
},
"collection": "pedidos",
"query": {
"status": "pendente",
"pagamento": "confirmado"
},
"update": {
"status": "processando",
"dataProcessamento": "{{now}}",
"processadoPor": "sistema-automatico"
},
"responseVariable": "resultado"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Atualizou Algum?",
"conditions": [
{
"variable": "resultado.modifiedCount",
"operator": "greater_than",
"value": "0",
"targetNode": "message_success"
}
],
"defaultTarget": "message_none"
}
},
{
"id": "message_success",
"type": "message",
"position": { "x": 700, "y": 50 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "✅ {{resultado.modifiedCount}} pedidos atualizados para 'processando'"
}
}
},
{
"id": "message_none",
"type": "message",
"position": { "x": 700, "y": 150 },
"data": {
"label": "Nenhum",
"parameters": {
"message": "ℹ️ Nenhum pedido pendente encontrado"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_start" },
{ "source": "message_start", "target": "mongodb_update" },
{ "source": "mongodb_update", "target": "condition_1" },
{ "source": "message_success", "target": "end_1" },
{ "source": "message_none", "target": "end_1" }
]
}
Saída esperada:
Sistema: 🔄 Processando pedidos pendentes...
Sistema: ✅ 5 pedidos atualizados para 'processando'
Exemplo 2: Atualizar Dados de Cliente
Objetivo: Permitir cliente atualizar seus próprios dados
JSON para Importar
{
"name": "Atualizar Dados de Cliente",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_email",
"type": "email",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Seu Email",
"parameters": {
"message": "Digite seu email:",
"variable": "email"
}
}
},
{
"id": "input_telefone",
"type": "phone",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Novo Telefone",
"parameters": {
"message": "Digite seu novo telefone:",
"variable": "novoTelefone"
}
}
},
{
"id": "input_endereco",
"type": "input",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Novo Endereço",
"parameters": {
"message": "Digite seu novo endereço:",
"variable": "novoEndereco"
}
}
},
{
"id": "mongodb_update",
"type": "mongodb",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Atualizar Cadastro",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "crm"
},
"collection": "clientes",
"query": {
"email": "{{email}}"
},
"update": {
"telefone": "{{novoTelefone}}",
"endereco": "{{novoEndereco}}",
"dataAtualizacao": "{{now}}"
},
"responseVariable": "resultado"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 850, "y": 100 },
"data": {
"label": "Encontrou Cliente?",
"conditions": [
{
"variable": "resultado.matchedCount",
"operator": "greater_than",
"value": "0",
"targetNode": "message_success"
}
],
"defaultTarget": "message_not_found"
}
},
{
"id": "message_success",
"type": "message",
"position": { "x": 1000, "y": 50 },
"data": {
"label": "Atualizado",
"parameters": {
"message": "✅ Seus dados foram atualizados com sucesso!\n📱 Telefone: {{novoTelefone}}\n📍 Endereço: {{novoEndereco}}"
}
}
},
{
"id": "message_not_found",
"type": "message",
"position": { "x": 1000, "y": 150 },
"data": {
"label": "Não Encontrado",
"parameters": {
"message": "❌ Email não encontrado em nosso sistema"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1200, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_email" },
{ "source": "input_email", "target": "input_telefone" },
{ "source": "input_telefone", "target": "input_endereco" },
{ "source": "input_endereco", "target": "mongodb_update" },
{ "source": "mongodb_update", "target": "condition_1" },
{ "source": "message_success", "target": "end_1" },
{ "source": "message_not_found", "target": "end_1" }
]
}
Saída esperada:
Sistema: Digite seu email:
Usuário: joao@example.com
Sistema: Digite seu novo telefone:
Usuário: 11987654321
Sistema: Digite seu novo endereço:
Usuário: Rua Nova, 123
Sistema: ✅ Seus dados foram atualizados com sucesso!
📱 Telefone: 11987654321
📍 Endereço: Rua Nova, 123
Exemplo 3: Atualização em Lote com Condições
Objetivo: Aplicar desconto em todos os produtos de uma categoria específica
JSON para Importar
{
"name": "Aplicar Desconto em Categoria",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_categoria",
"type": "input",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Categoria",
"parameters": {
"message": "Digite a categoria para aplicar desconto:",
"variable": "categoria"
}
}
},
{
"id": "input_desconto",
"type": "number",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Percentual",
"parameters": {
"message": "Digite o percentual de desconto (ex: 20):",
"variable": "desconto"
}
}
},
{
"id": "mongodb_update",
"type": "mongodb",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Aplicar Desconto",
"operation": "update",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "ecommerce"
},
"collection": "produtos",
"query": {
"categoria": "{{categoria}}",
"ativo": true,
"estoque": { "$gt": 0 }
},
"update": {
"emPromocao": true,
"desconto": "{{desconto}}",
"dataPromocao": "{{now}}"
},
"responseVariable": "resultado"
}
},
{
"id": "message_result",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Resultado",
"parameters": {
"message": "✅ Promoção aplicada!\n\n📦 Categoria: {{categoria}}\n💰 Desconto: {{desconto}}%\n🔄 Produtos atualizados: {{resultado.modifiedCount}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_categoria" },
{ "source": "input_categoria", "target": "input_desconto" },
{ "source": "input_desconto", "target": "mongodb_update" },
{ "source": "mongodb_update", "target": "message_result" },
{ "source": "message_result", "target": "end_1" }
]
}
Saída esperada:
Sistema: Digite a categoria para aplicar desconto:
Usuário: eletronicos
Sistema: Digite o percentual de desconto (ex: 20):
Usuário: 15
Sistema: ✅ Promoção aplicada!
📦 Categoria: eletronicos
💰 Desconto: 15%
🔄 Produtos atualizados: 23
Resposta do Node
{
"matchedCount": 5,
"modifiedCount": 5,
"acknowledged": true
}
Campos:
- matchedCount: Número de documentos que atenderam à query
- modifiedCount: Número de documentos efetivamente modificados
- acknowledged: Se a operação foi reconhecida pelo servidor
Boas Práticas
✅ SIM:
- Sempre verifique
matchedCountpara saber se encontrou documentos - Use
modifiedCountpara saber quantos foram realmente alterados - Combine com CONDITION para tratar caso nenhum documento seja encontrado
- Inclua timestamp de atualização (dataAtualizacao) nos updates
- Use filtros específicos na query para evitar updates indesejados
- Teste queries com FIND antes de executar UPDATE em produção
❌ NÃO:
- Não use query vazia
{}sem certeza (atualizará TODOS os documentos) - Não assuma que
matchedCount = modifiedCount(podem já ter os valores) - Não esqueça de validar entrada do usuário antes de atualizar
- Não use UPDATE quando precisa ver o documento atualizado (use FIND_ONE_AND_UPDATE)
- Não tente atualizar _id (MongoDB não permite)
Dicas
💡 Dica 1: matchedCount > modifiedCount significa que alguns documentos já tinham os valores
💡 Dica 2: O operador $set é aplicado automaticamente - não precisa incluir no objeto update
💡 Dica 3: Para atualizar apenas 1 documento específico, use _id na query
💡 Dica 4: updateMany atualiza TODOS os documentos que correspondem - use filtros específicos
💡 Dica 5: Combine com FIND antes para preview de quantos documentos serão afetados
Próximos Nodes
→ MONGODB FIND - Buscar documentos antes de atualizar → MONGODB FIND_ONE_AND_UPDATE - Atualizar e ver resultado → MONGODB DELETE - Remover documentos → MONGODB INSERT - Criar novos documentos