Node Merge
O node Merge é 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.
Quando usar o Merge
O node Merge é ideal para:
- 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
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
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
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
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
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
Exemplo 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"
}
Exemplo 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
}
]
Exemplo 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
}
Exemplo 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
Merge com Transformação de Dados
// Code Node - Preparar dados para merge
const dadosPreparados = $json.map(item => ({
...item,
timestamp: new Date().toISOString(),
fonte: 'api_principal'
}));
return dadosPreparados;
// Merge Node - Combinar dados
{
"mode": "combine",
"combineBy": "id",
"options": {
"combineMode": "multiplex"
}
}
// Code Node - Processar dados consolidados
const dadosConsolidados = $json.map(item => ({
...item,
processado_em: new Date().toISOString()
}));
return dadosConsolidados;
Merge com Validação
// Code Node - Validar dados antes do merge
const dados = $json;
const validacoes = {
nome: dados.nome && dados.nome.length > 0,
email: dados.email && dados.email.includes('@'),
telefone: dados.telefone && dados.telefone.length >= 10
};
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"
}
}
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"
}
}
Merge com Cache
// Code Node - Cache de dados
const cache = new Map();
async function buscarDados(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
Merge com Múltiplas Fontes
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"
}
Merge com Paralelização
Boas Práticas
Escolha do Campo de Combinação
// ✅ Bom: Campo único e estável
{
"combineBy": "id"
}
// ❌ Evitar: Campo que pode mudar
{
"combineBy": "nome"
}
Modo de Combinação
// ✅ Bom: Multiplex para dados independentes
{
"combineMode": "multiplex"
}
// ✅ Bom: Wait for All para dados interdependentes
{
"combineMode": "waitForAll"
}
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
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 de Merge Node
// Função de debug para Merge Node
function debugMerge(dados) {
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 Nós
Merge Node com 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()}}"
}
]
}
}
Merge Node com 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"
}
]
}
Merge Node com 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
- Switch Node - Múltiplas condições
- If Node - Controle de fluxo
- Aggregate Node - Agregação de dados
- Set Node - Manipulação de dados
- Expressões n8n - Usar expressões em merge