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:
- Excluir múltiplos documentos: Remover vários registros que atendem a um critério
- Limpeza de dados: Excluir registros antigos, inválidos ou temporários
- Exclusão em lote: Remover todos os documentos que correspondem à query
- Retornar estatísticas: Informar quantos documentos foram removidos
Como funciona internamente?
Quando o MONGODB DELETE é 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: Substitui variáveis e converte _id strings para ObjectId
- Executa deleteMany: Remove TODOS os documentos que atendem à query
- Retorna estatísticas: Informa deletedCount e acknowledged
- 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
- Excluir registros antigos: "Remover logs com mais de 90 dias"
- Cancelar pedidos: "Excluir pedidos pendentes há mais de 7 dias"
- Limpar dados temporários: "Remover sessões expiradas"
- 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 > 0para 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