Pular para o conteúdo principal

Merge Node

O Merge Node é uma ferramenta essencial do n8n para combinar dados de múltiplas fontes. Ele permite unir informações de diferentes caminhos do workflow, criando datasets consolidados e enriquecidos.

O que é o Merge Node?

O Merge Node permite:

  • Combinar dados de múltiplos nodes
  • Sincronizar informações de diferentes fontes
  • Enriquecer dados com informações adicionais
  • Consolidar resultados de processamentos paralelos
  • Criar datasets completos e estruturados
  • Unificar fluxos de dados separados

Quando Usar o Merge Node

  • Consolidação de dados de múltiplas APIs
  • Enriquecimento de dados com informações complementares
  • Unificação de resultados de processamentos paralelos
  • Criação de relatórios consolidados
  • Sincronização de dados de diferentes sistemas
  • Combinação de dados de diferentes períodos

Configuração Básica

Estrutura do Merge Node

// Merge Node - Estrutura básica
{
  "mode": "combine", // combine, append, overwrite
  "combineBy": "id", // Campo para combinar dados
  "options": {
    "combineMode": "multiplex", // multiplex, waitForAll
    "combineBy": "id"
  }
}

Modos de Operação

1. Combine Mode

// Combinar dados baseado em campo comum
{
  "mode": "combine",
  "combineBy": "id",
  "options": {
    "combineMode": "multiplex"
  }
}

Funcionamento:

  • Combina dados que têm o mesmo valor no campo especificado
  • Cria um item consolidado com dados de todas as fontes
  • Mantém a estrutura original dos dados

2. Append Mode

// Anexar dados de diferentes fontes
{
  "mode": "append",
  "options": {
    "combineMode": "multiplex"
  }
}

Funcionamento:

  • Adiciona dados de uma fonte aos dados de outra
  • Cria arrays com todos os itens
  • Útil para consolidar listas

3. Overwrite Mode

// Sobrescrever dados com informações mais recentes
{
  "mode": "overwrite",
  "combineBy": "id",
  "options": {
    "combineMode": "multiplex"
  }
}

Funcionamento:

  • Substitui dados antigos por novos
  • Mantém apenas a versão mais recente
  • Útil para atualizações de dados

Modos de Combinação

1. Multiplex

// Processar dados assim que chegarem
{
  "combineMode": "multiplex"
}

Características:

  • Processa dados assim que chegam de qualquer fonte
  • Não espera por todas as fontes
  • Mais rápido e eficiente
  • Pode resultar em dados incompletos

2. Wait for All

// Aguardar dados de todas as fontes
{
  "combineMode": "waitForAll"
}

Características:

  • Aguarda dados de todas as fontes antes de processar
  • Garante dados completos
  • Pode ser mais lento
  • Útil para dados interdependentes

Exemplos Práticos

1. Enriquecimento de Dados de Cliente

// Merge Node - Enriquecer dados de cliente
{
  "mode": "combine",
  "combineBy": "cliente_id",
  "options": {
    "combineMode": "multiplex"
  }
}

Fontes de dados:

  • Fonte 1: Dados básicos do cliente (nome, email, telefone)
  • Fonte 2: Histórico de compras (total, frequência, última compra)
  • Fonte 3: Dados de endereço (CEP, cidade, estado)

Resultado:

{
  "cliente_id": "12345",
  "nome": "João Silva",
  "email": "joao@email.com",
  "telefone": "(11) 99999-9999",
  "total_compras": 15000,
  "frequencia": 5,
  "ultima_compra": "2024-01-15",
  "cep": "01234-567",
  "cidade": "São Paulo",
  "estado": "SP"
}

2. Consolidação de Vendas por Região

// Merge Node - Consolidar vendas
{
  "mode": "append",
  "options": {
    "combineMode": "waitForAll"
  }
}

Fontes de dados:

  • Fonte 1: Vendas da região Norte
  • Fonte 2: Vendas da região Sul
  • Fonte 3: Vendas da região Sudeste

Resultado:

[
  {
    "regiao": "Norte",
    "vendas": 5000,
    "clientes": 50
  },
  {
    "regiao": "Sul",
    "vendas": 8000,
    "clientes": 80
  },
  {
    "regiao": "Sudeste",
    "vendas": 12000,
    "clientes": 120
  }
]

3. Atualização de Produtos

// Merge Node - Atualizar produtos
{
  "mode": "overwrite",
  "combineBy": "produto_id",
  "options": {
    "combineMode": "multiplex"
  }
}

Fontes de dados:

  • Fonte 1: Dados básicos do produto (nome, categoria, preço)
  • Fonte 2: Dados atualizados (preço, estoque, status)

Resultado:

{
  "produto_id": "P001",
  "nome": "Notebook Dell",
  "categoria": "Eletrônicos",
  "preco": 3500.00, // Atualizado
  "estoque": 15,    // Novo campo
  "status": "ativo" // Novo campo
}

4. Relatório Consolidado

// Merge Node - Relatório consolidado
{
  "mode": "combine",
  "combineBy": "data",
  "options": {
    "combineMode": "waitForAll"
  }
}

Fontes de dados:

  • Fonte 1: Vendas do dia
  • Fonte 2: Clientes novos
  • Fonte 3: Produtos mais vendidos

Resultado:

{
  "data": "2024-01-15",
  "vendas": {
    "total": 15000,
    "quantidade": 25
  },
  "clientes": {
    "novos": 5,
    "ativos": 120
  },
  "produtos": [
    {
      "nome": "Notebook",
      "quantidade": 10
    },
    {
      "nome": "Mouse",
      "quantidade": 15
    }
  ]
}

Casos de Uso Avançados

1. Merge com Transformação de Dados

// Code Node - Preparar dados para merge
const prepararDados = (dados) => {
  return dados.map(item => ({
    ...item,
    timestamp: new Date().toISOString(),
    fonte: 'sistema_principal'
  }));
};

// Merge Node - Combinar dados
{
  "mode": "combine",
  "combineBy": "id",
  "options": {
    "combineMode": "multiplex"
  }
}

// Code Node - Processar dados consolidados
const processarConsolidado = (dados) => {
  return {
    ...dados,
    total_campos: Object.keys(dados).length,
    processado_em: new Date().toISOString()
  };
};

2. Merge com Validação

// Code Node - Validar dados antes do merge
const validarDados = (dados) => {
  const validacoes = {
    tem_id: dados.id && dados.id.length > 0,
    tem_nome: dados.nome && dados.nome.length > 0,
    tem_email: dados.email && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(dados.email)
  };
  
  const todasValidas = Object.values(validacoes).every(v => v);
  
  if (!todasValidas) {
    console.warn('Dados inválidos:', dados, validacoes);
    return null;
  }
  
  return dados;
};

// Merge Node - Combinar apenas dados válidos
{
  "mode": "combine",
  "combineBy": "id",
  "options": {
    "combineMode": "multiplex"
  }
}

3. Merge com Agregação

// Aggregate Node - Agregar dados por categoria
{
  "groupBy": ["categoria"],
  "aggregations": [
    {
      "field": "valor",
      "operation": "sum",
      "name": "total_categoria"
    },
    {
      "field": "id",
      "operation": "count",
      "name": "quantidade_categoria"
    }
  ]
}

// Merge Node - Combinar com dados originais
{
  "mode": "combine",
  "combineBy": "categoria",
  "options": {
    "combineMode": "multiplex"
  }
}

4. Merge com Cache

// Code Node - Cache de dados
const cache = new Map();

const obterComCache = async (id) => {
  if (cache.has(id)) {
    return cache.get(id);
  }
  
  const dados = await buscarDados(id);
  cache.set(id, dados);
  return dados;
};

// Merge Node - Combinar dados frescos com cache
{
  "mode": "combine",
  "combineBy": "id",
  "options": {
    "combineMode": "multiplex"
  }
}

Workflows Complexos

1. Merge com Múltiplas Fontes

Fonte A → Processamento A → Merge Node
    ↓              ↓              ↓
Fonte B → Processamento B → Merge Node → Resultado Consolidado
    ↓              ↓              ↓
Fonte C → Processamento C → Merge Node

2. Merge Hierárquico

// Primeiro Merge - Dados básicos
{
  "mode": "combine",
  "combineBy": "cliente_id"
}

// Segundo Merge - Dados financeiros
{
  "mode": "combine",
  "combineBy": "cliente_id"
}

// Terceiro Merge - Dados de endereço
{
  "mode": "combine",
  "combineBy": "cliente_id"
}

3. Merge com Paralelização

Dados Originais → Switch Node → Processamento A → Merge Node
      ↓              ↓              ↓              ↓
Dados Originais → Switch Node → Processamento B → Merge Node
      ↓              ↓              ↓              ↓
Dados Originais → Switch Node → Processamento C → Merge Node

Boas Práticas

1. Escolha do Campo de Combinação

// ✅ Bom: Campo único e estável
{
  "combineBy": "id"
}

// ❌ Evitar: Campo que pode mudar
{
  "combineBy": "nome"
}

2. Modo de Combinação

// ✅ Bom: Multiplex para dados independentes
{
  "combineMode": "multiplex"
}

// ✅ Bom: Wait for All para dados interdependentes
{
  "combineMode": "waitForAll"
}

3. Validação de Dados

// ✅ Bom: Validar antes do merge
const dadosValidados = dados.filter(item => 
  item.id && item.nome && item.email
);

// ❌ Evitar: Merge sem validação
// Pode resultar em dados inconsistentes

4. Tratamento de Erros

// ✅ Bom: Tratar dados ausentes
const dadosCompletos = dados.map(item => ({
  ...item,
  fonte: item.fonte || 'desconhecida',
  timestamp: item.timestamp || new Date().toISOString()
}));

// ❌ Evitar: Ignorar dados ausentes
// Pode causar problemas no merge

Troubleshooting

Problemas Comuns

Dados não são combinados

  • Verifique se o campo de combinação existe
  • Confirme se os valores são iguais
  • Teste com dados de exemplo
  • Use Debug Helper para ver dados

Merge lento

  • Use multiplex para dados independentes
  • Reduza o número de fontes
  • Otimize as consultas de dados
  • Considere usar cache

Dados duplicados

  • Verifique se há campos únicos
  • Use overwrite mode quando apropriado
  • Implemente validação de duplicatas
  • Considere usar Aggregate Node

Debug

// Code Node - Debug de Merge Node
const debugMerge = (dados) => {
  console.log('=== DEBUG MERGE ===');
  console.log('Dados recebidos:', dados);
  console.log('Número de itens:', dados.length);
  console.log('Campos disponíveis:', Object.keys(dados[0] || {}));
  console.log('Exemplo de item:', dados[0]);
  console.log('==================');
  
  return dados;
};

// Usar após o Merge Node
return { json: debugMerge($json) };

Integração com Outros Nodes

1. Merge Node + Set Node

// Merge Node - Combinar dados
{
  "mode": "combine",
  "combineBy": "id"
}

// Set Node - Adicionar metadados
{
  "mode": "keepAllSet",
  "values": {
    "string": [
      {
        "name": "fonte_consolidada",
        "value": "{{ $json.fonte_1 || $json.fonte_2 || 'múltiplas' }}"
      },
      {
        "name": "timestamp_merge",
        "value": "{{ $now.toISOString() }}"
      }
    ]
  }
}

2. Merge Node + Aggregate Node

// Merge Node - Combinar dados de vendas
{
  "mode": "append",
  "options": {
    "combineMode": "waitForAll"
  }
}

// Aggregate Node - Calcular totais
{
  "groupBy": ["regiao"],
  "aggregations": [
    {
      "field": "vendas",
      "operation": "sum",
      "name": "total_vendas"
    },
    {
      "field": "clientes",
      "operation": "sum",
      "name": "total_clientes"
    }
  ]
}

3. Merge Node + If Node

// Merge Node - Combinar dados de cliente
{
  "mode": "combine",
  "combineBy": "cliente_id"
}

// If Node - Verificar dados completos
{
  "condition": "{{ $json.nome && $json.email && $json.telefone }}",
  "true": "Dados Completos",
  "false": "Dados Incompletos"
}

Próximos Passos