Pular para conteúdo

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:

  1. Atualizar múltiplos documentos: Modificar vários registros que atendem a um critério
  2. Modificar campos específicos: Alterar apenas os campos necessários, preservando outros
  3. Atualizar em lote: Aplicar mudanças a todos os documentos que correspondem à query
  4. Retornar estatísticas: Informar quantos documentos foram afetados

Como funciona internamente?

Quando o MONGODB UPDATE é executado, o sistema:

  1. Valida configuração: Verifica se as credenciais MongoDB foram fornecidas
  2. Estabelece conexão: Conecta ao servidor MongoDB usando as credenciais
  3. Seleciona coleção: Acessa a coleção especificada no banco de dados
  4. Processa query e update: Substitui variáveis em ambos os objetos
  5. Converte _id: Transforma strings de ObjectId quando necessário
  6. Executa updateMany: Atualiza TODOS os documentos que atendem à query
  7. Usa $set automático: Envolve o update em operador $set
  8. Retorna estatísticas: Informa matchedCount, modifiedCount e acknowledged
  9. 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

  1. Atualizar status: "Marcar todos os pedidos como 'enviado'"
  2. Modificar preços: "Aumentar preço de todos produtos da categoria X em 10%"
  3. Atualizar dados: "Corrigir campo telefone do cliente"
  4. 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 matchedCount para saber se encontrou documentos
  • Use modifiedCount para 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