Pular para conteúdo

MONGODB DELETE - Remover Documentos do MongoDB

O que é este Node?

O MONGODB DELETE é o node responsável por remover um ou múltiplos documentos de uma coleção MongoDB usando uma query de filtro.

Por que este Node existe?

Remover dados é uma operação fundamental mas deve ser feita com cuidado. O MONGODB DELETE existe para:

  1. Excluir múltiplos documentos: Remover vários registros que atendem a um critério
  2. Limpeza de dados: Excluir registros antigos, inválidos ou temporários
  3. Exclusão em lote: Remover todos os documentos que correspondem à query
  4. Retornar estatísticas: Informar quantos documentos foram removidos

Como funciona internamente?

Quando o MONGODB DELETE é 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: Substitui variáveis e converte _id strings para ObjectId
  5. Executa deleteMany: Remove TODOS os documentos que atendem à query
  6. Retorna estatísticas: Informa deletedCount e acknowledged
  7. Fecha conexão: Encerra a conexão com MongoDB

IMPORTANTE: Esta operação é IRREVERSÍVEL! Documentos excluídos não podem ser recuperados.

Código interno (mongodb.executor.ts:190-206):

private async deleteDocument(
  db: Db,
  collectionName: string,
  query: any,
  context: ExecutionContext,
): Promise<any> {
  const replacedQuery = this.replaceObjectVariables(query, context.variables);
  const parsedQuery = this.parseMongoQuery(replacedQuery);

  const collection = db.collection(collectionName);
  const result = await collection.deleteMany(parsedQuery);

  return {
    deletedCount: result.deletedCount,
    acknowledged: result.acknowledged,
  };
}

Quando você DEVE usar este Node?

Use MONGODB DELETE sempre que precisar remover documentos permanentemente:

Casos de uso

  1. Excluir registros antigos: "Remover logs com mais de 90 dias"
  2. Cancelar pedidos: "Excluir pedidos pendentes há mais de 7 dias"
  3. Limpar dados temporários: "Remover sessões expiradas"
  4. Exclusão por solicitação: "Remover dados do usuário (LGPD/GDPR)"

Quando NÃO usar MONGODB DELETE

  • Soft delete preferível: Considere UPDATE com campo "excluido: true" ao invés de deletar
  • Auditoria necessária: Use soft delete para manter histórico
  • Pode precisar recuperar: Arquive em outra coleção antes de deletar
  • Incerteza: NUNCA delete sem ter certeza absoluta da query

Parâmetros Detalhados

operation (string, obrigatório)

O que é: Define qual operação MongoDB será executada. Para remover documentos, use "delete".

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste MongoDB Delete - 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": "Deletar Produto",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "loja"
        },
        "collection": "produtos",
        "query": { "_id": "507f1f77bcf86cd799439011" },
        "responseVariable": "resultado"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Removido! {{resultado.deletedCount}} 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: "✅ Removido! 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 Delete - 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": "Deletar com Auth",
        "operation": "delete",
        "config": {
          "host": "localhost",
          "port": 27017,
          "database": "temp",
          "user": "admin",
          "password": "senha123"
        },
        "collection": "sessoes",
        "query": { "expirado": true },
        "responseVariable": "resultado"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Sessões expiradas removidas: {{resultado.deletedCount}}"
        }
      }
    },
    {
      "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: "Sessões expiradas removidas: X"

collection (string, obrigatório)

O que é: Nome da coleção MongoDB de onde os documentos serão removidos.

Flow completo para testar:

{
  "name": "Teste MongoDB Delete - 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": "Deletar da Coleção",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "logs"
        },
        "collection": "eventos",
        "query": { "tipo": "debug" },
        "responseVariable": "resultado"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mostrar Resultado",
        "parameters": {
          "message": "{{resultado.deletedCount}} logs de debug removidos"
        }
      }
    },
    {
      "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 logs de debug removidos"

query (object, obrigatório)

O que é: Filtro para selecionar quais documentos serão removidos. CUIDADO: query vazia {} remove TODOS os documentos!

Flow completo para testar:

{
  "name": "Teste MongoDB Delete - 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": "Deletar Antigos",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "logs"
        },
        "collection": "acessos",
        "query": {
          "timestamp": { "$lt": "2024-01-01T00:00:00.000Z" },
          "arquivado": true
        },
        "responseVariable": "resultado"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "🗑️ {{resultado.deletedCount}} registros antigos removidos"
        }
      }
    },
    {
      "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 registros antigos removidos"

responseVariable (string, opcional)

O que é: Nome da variável onde o resultado da exclusão será armazenado (contém deletedCount e acknowledged).

Padrão: Se não especificado, resultado não é armazenado

Flow completo para testar:

{
  "name": "Teste MongoDB Delete - 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": "Deletar e Salvar Stats",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "temp"
        },
        "collection": "cache",
        "query": { "expirado": true },
        "responseVariable": "stats"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mostrar Estatísticas",
        "parameters": {
          "message": "📊 Limpeza de cache:\n🗑️ Removidos: {{stats.deletedCount}}\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: "📊 Limpeza de cache: 🗑️ Removidos: X ..."

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Tipo de operação MongoDB ("delete")
config object Sim Configuração de conexão MongoDB
collection string Sim Nome da coleção
query object Sim Filtro para selecionar documentos a remover
responseVariable string Não Variável para armazenar estatísticas

Exemplo 1: Limpar Logs Antigos (com confirmação)

Objetivo: Remover logs com mais de 90 dias, mas pedir confirmação antes

JSON para Importar

{
  "name": "Limpar Logs Antigos",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "mongodb_count",
      "type": "mongodb",
      "position": { "x": 250, "y": 100 },
      "data": {
        "label": "Contar Logs Antigos",
        "operation": "find",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "logs"
        },
        "collection": "eventos",
        "query": {
          "timestamp": { "$lt": "{{data_90_dias_atras}}" }
        },
        "responseVariable": "logsAntigos"
      }
    },
    {
      "id": "message_confirm",
      "type": "message",
      "position": { "x": 400, "y": 100 },
      "data": {
        "label": "Pedir Confirmação",
        "parameters": {
          "message": "⚠️ Você está prestes a remover {{logsAntigos.count}} logs antigos.\n\nDigite 'CONFIRMAR' para prosseguir:"
        }
      }
    },
    {
      "id": "input_confirm",
      "type": "input",
      "position": { "x": 550, "y": 100 },
      "data": {
        "label": "Capturar Confirmação",
        "parameters": {
          "variable": "confirmacao"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmou?",
        "conditions": [
          {
            "variable": "confirmacao",
            "operator": "equals",
            "value": "CONFIRMAR",
            "targetNode": "mongodb_delete"
          }
        ],
        "defaultTarget": "message_cancelled"
      }
    },
    {
      "id": "mongodb_delete",
      "type": "mongodb",
      "position": { "x": 850, "y": 50 },
      "data": {
        "label": "Remover Logs",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "logs"
        },
        "collection": "eventos",
        "query": {
          "timestamp": { "$lt": "{{data_90_dias_atras}}" }
        },
        "responseVariable": "resultado"
      }
    },
    {
      "id": "message_success",
      "type": "message",
      "position": { "x": 1000, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "✅ Limpeza concluída!\n🗑️ {{resultado.deletedCount}} logs removidos"
        }
      }
    },
    {
      "id": "message_cancelled",
      "type": "message",
      "position": { "x": 850, "y": 150 },
      "data": {
        "label": "Cancelado",
        "parameters": {
          "message": "❌ Operação cancelada. Nenhum log foi removido."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1150, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "mongodb_count" },
    { "source": "mongodb_count", "target": "message_confirm" },
    { "source": "message_confirm", "target": "input_confirm" },
    { "source": "input_confirm", "target": "condition_1" },
    { "source": "mongodb_delete", "target": "message_success" },
    { "source": "message_success", "target": "end_1" },
    { "source": "message_cancelled", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: ⚠️ Você está prestes a remover 1523 logs antigos.

Digite 'CONFIRMAR' para prosseguir:
Usuário: CONFIRMAR
Sistema: ✅ Limpeza concluída!
🗑️ 1523 logs removidos

Exemplo 2: Cancelar Pedidos Expirados

Objetivo: Remover pedidos pendentes há mais de 7 dias automaticamente

JSON para Importar

{
  "name": "Cancelar Pedidos Expirados",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 250, "y": 100 },
      "data": {
        "label": "Calcular Data Limite",
        "parameters": {
          "variables": [
            { "name": "data_limite", "value": "{{date_subtract_days(now, 7)}}" }
          ]
        }
      }
    },
    {
      "id": "mongodb_delete",
      "type": "mongodb",
      "position": { "x": 400, "y": 100 },
      "data": {
        "label": "Remover Pedidos Expirados",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "ecommerce"
        },
        "collection": "pedidos",
        "query": {
          "status": "pendente",
          "dataCriacao": { "$lt": "{{data_limite}}" },
          "pagamento": { "$ne": "confirmado" }
        },
        "responseVariable": "resultado"
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 550, "y": 100 },
      "data": {
        "label": "Removeu Algum?",
        "conditions": [
          {
            "variable": "resultado.deletedCount",
            "operator": "greater_than",
            "value": "0",
            "targetNode": "message_removed"
          }
        ],
        "defaultTarget": "message_none"
      }
    },
    {
      "id": "message_removed",
      "type": "message",
      "position": { "x": 700, "y": 50 },
      "data": {
        "label": "Pedidos Removidos",
        "parameters": {
          "message": "🗑️ {{resultado.deletedCount}} pedidos expirados foram cancelados e removidos"
        }
      }
    },
    {
      "id": "message_none",
      "type": "message",
      "position": { "x": 700, "y": 150 },
      "data": {
        "label": "Nenhum Removido",
        "parameters": {
          "message": "✅ Nenhum pedido expirado encontrado"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "mongodb_delete" },
    { "source": "mongodb_delete", "target": "condition_1" },
    { "source": "message_removed", "target": "end_1" },
    { "source": "message_none", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 🗑️ 12 pedidos expirados foram cancelados e removidos

Exemplo 3: Exclusão de Dados por Solicitação (LGPD)

Objetivo: Remover todos os dados de um usuário específico

JSON para Importar

{
  "name": "Excluir Dados do Usuário (LGPD)",
  "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": "Email do Usuário",
        "parameters": {
          "message": "Digite o email do usuário para exclusão total:",
          "variable": "emailUsuario"
        }
      }
    },
    {
      "id": "message_warning",
      "type": "message",
      "position": { "x": 400, "y": 100 },
      "data": {
        "label": "Aviso LGPD",
        "parameters": {
          "message": "⚠️ ATENÇÃO: Você está prestes a EXCLUIR PERMANENTEMENTE todos os dados de {{emailUsuario}}.\n\nEsta ação é IRREVERSÍVEL.\n\nDigite 'EXCLUIR TUDO' para confirmar:"
        }
      }
    },
    {
      "id": "input_confirm",
      "type": "input",
      "position": { "x": 550, "y": 100 },
      "data": {
        "label": "Confirmação",
        "parameters": {
          "variable": "confirmacao"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmou?",
        "conditions": [
          {
            "variable": "confirmacao",
            "operator": "equals",
            "value": "EXCLUIR TUDO",
            "targetNode": "mongodb_delete_cliente"
          }
        ],
        "defaultTarget": "message_cancelled"
      }
    },
    {
      "id": "mongodb_delete_cliente",
      "type": "mongodb",
      "position": { "x": 850, "y": 50 },
      "data": {
        "label": "Excluir Cadastro",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "crm"
        },
        "collection": "clientes",
        "query": {
          "email": "{{emailUsuario}}"
        },
        "responseVariable": "resultadoCliente"
      }
    },
    {
      "id": "mongodb_delete_pedidos",
      "type": "mongodb",
      "position": { "x": 1000, "y": 50 },
      "data": {
        "label": "Excluir Pedidos",
        "operation": "delete",
        "config": {
          "connectionString": "mongodb://localhost:27017",
          "database": "ecommerce"
        },
        "collection": "pedidos",
        "query": {
          "clienteEmail": "{{emailUsuario}}"
        },
        "responseVariable": "resultadoPedidos"
      }
    },
    {
      "id": "message_success",
      "type": "message",
      "position": { "x": 1150, "y": 50 },
      "data": {
        "label": "Exclusão Completa",
        "parameters": {
          "message": "✅ Dados excluídos com sucesso (LGPD)\n\n📧 Email: {{emailUsuario}}\n👤 Cadastros: {{resultadoCliente.deletedCount}}\n📦 Pedidos: {{resultadoPedidos.deletedCount}}"
        }
      }
    },
    {
      "id": "message_cancelled",
      "type": "message",
      "position": { "x": 850, "y": 150 },
      "data": {
        "label": "Cancelado",
        "parameters": {
          "message": "❌ Operação cancelada. Nenhum dado foi excluído."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_email" },
    { "source": "input_email", "target": "message_warning" },
    { "source": "message_warning", "target": "input_confirm" },
    { "source": "input_confirm", "target": "condition_1" },
    { "source": "mongodb_delete_cliente", "target": "mongodb_delete_pedidos" },
    { "source": "mongodb_delete_pedidos", "target": "message_success" },
    { "source": "message_success", "target": "end_1" },
    { "source": "message_cancelled", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite o email do usuário para exclusão total:
Usuário: joao@example.com
Sistema: ⚠️ ATENÇÃO: Você está prestes a EXCLUIR PERMANENTEMENTE todos os dados de joao@example.com.

Esta ação é IRREVERSÍVEL.

Digite 'EXCLUIR TUDO' para confirmar:
Usuário: EXCLUIR TUDO
Sistema: ✅ Dados excluídos com sucesso (LGPD)

📧 Email: joao@example.com
👤 Cadastros: 1
📦 Pedidos: 5

Resposta do Node

{
  "deletedCount": 3,
  "acknowledged": true
}

Campos: - deletedCount: Número de documentos removidos - acknowledged: Se a operação foi reconhecida pelo servidor

Boas Práticas

SIM:

  • SEMPRE confirme com usuário antes de deletar (especialmente em produção)
  • Use FIND primeiro para preview de quantos documentos serão deletados
  • Considere soft delete (UPDATE com campo "deletado: true") ao invés de DELETE
  • Faça backup antes de operações de exclusão em massa
  • Use filtros MUITO específicos na query
  • Valide que deletedCount > 0 para confirmar que algo foi removido
  • Archive dados importantes em outra coleção antes de deletar

NÃO:

  • NUNCA use query vazia {} (deletará TUDO!)
  • Não delete sem confirmação em operações críticas
  • Não delete dados que podem ser necessários para auditoria
  • Não ignore o valor de deletedCount (pode ser 0 se query não encontrou nada)
  • Não delete sem ter backup ou forma de recuperação
  • Não use DELETE quando soft delete é mais apropriado

Dicas

💡 Dica 1: Use FIND com a mesma query antes de DELETE para verificar o que será removido

💡 Dica 2: Considere criar campo "deletedAt" e fazer soft delete ao invés de remover

💡 Dica 3: Para LGPD/GDPR, combine múltiplos DELETEs para remover dados de todas as coleções

💡 Dica 4: Se deletedCount = 0, a query não encontrou nenhum documento

💡 Dica 5: deleteMany remove TODOS os docs que correspondem - use _id para deletar apenas 1

Próximos Nodes

MONGODB FIND - Verificar documentos antes de deletar → MONGODB UPDATE - Fazer soft delete ao invés de remover → MONGODB INSERT - Arquivar antes de deletar → MONGODB FIND_ONE - Verificar se documento existe antes de deletar