Método custom()
custom()
Section titled “custom()”Executa uma função de filtro personalizada para busca avançada e complexa em registros.
Sintaxe
Section titled “Sintaxe”await db.custom(callback)Parâmetros
Section titled “Parâmetros”callback(function): Função de filtro personalizada que recebe cada registro
Callback
Section titled “Callback”function callback(value, key, allData) { // value: valor do registro atual // key: chave do registro atual // allData: todos os dados do banco // Retorna true para incluir o registro, false para excluir}Retorno
Section titled “Retorno”Retorna um objeto com as chaves e valores que passaram no filtro.
Exemplos
Section titled “Exemplos”Filtro Simples por Propriedade
Section titled “Filtro Simples por Propriedade”await db.set('user:1', { nome: 'João', idade: 25, ativo: true });await db.set('user:2', { nome: 'Maria', idade: 30, ativo: false });await db.set('user:3', { nome: 'Pedro', idade: 22, ativo: true });await db.set('config', { theme: 'dark' });
// Filtrar apenas usuários ativosconst usuariosAtivos = await db.custom((value, key) => { return key.startsWith('user:') && value.ativo === true;});
console.log(usuariosAtivos);// {// 'user:1': { nome: 'João', idade: 25, ativo: true },// 'user:3': { nome: 'Pedro', idade: 22, ativo: true }// }Filtro Complexo com Múltiplas Condições
Section titled “Filtro Complexo com Múltiplas Condições”const produtos = { 'prod:1': { nome: 'Laptop', categoria: 'eletrônicos', preco: 2500, estoque: 5 }, 'prod:2': { nome: 'Mouse', categoria: 'eletrônicos', preco: 50, estoque: 100 }, 'prod:3': { nome: 'Livro', categoria: 'educação', preco: 30, estoque: 0 }, 'prod:4': { nome: 'Monitor', categoria: 'eletrônicos', preco: 800, estoque: 3 }};
for (const [key, value] of Object.entries(produtos)) { await db.set(key, value);}
// Produtos eletrônicos caros com estoque baixoconst produtosCriticos = await db.custom((value, key) => { return key.startsWith('prod:') && value.categoria === 'eletrônicos' && value.preco > 500 && value.estoque < 10;});
console.log(produtosCriticos);// Retorna Laptop e MonitorFiltro por Data e Período
Section titled “Filtro por Data e Período”const eventos = { 'event:1': { nome: 'Reunião', data: new Date('2024-01-15'), participantes: 10 }, 'event:2': { nome: 'Workshop', data: new Date('2024-02-20'), participantes: 25 }, 'event:3': { nome: 'Conferência', data: new Date('2024-01-30'), participantes: 100 }};
for (const [key, value] of Object.entries(eventos)) { await db.set(key, value);}
// Eventos de janeiro de 2024 com mais de 5 participantesconst eventosJaneiro = await db.custom((value, key) => { if (!key.startsWith('event:')) return false;
const data = new Date(value.data); const isJaneiro2024 = data.getFullYear() === 2024 && data.getMonth() === 0;
return isJaneiro2024 && value.participantes > 5;});
console.log(Object.keys(eventosJaneiro)); // ['event:1', 'event:3']Filtro com Cálculos Complexos
Section titled “Filtro com Cálculos Complexos”const vendedores = { 'vend:1': { nome: 'João', vendas: [100, 200, 150], meta: 400 }, 'vend:2': { nome: 'Maria', vendas: [300, 250, 200], meta: 600 }, 'vend:3': { nome: 'Pedro', vendas: [50, 80, 70], meta: 300 }};
for (const [key, value] of Object.entries(vendedores)) { await db.set(key, value);}
// Vendedores que bateram a metaconst vendedoresTopPerformance = await db.custom((value, key) => { if (!key.startsWith('vend:')) return false;
const totalVendas = value.vendas.reduce((sum, venda) => sum + venda, 0); return totalVendas >= value.meta;});
console.log(vendedoresTopPerformance);Filtro Usando Contexto Global
Section titled “Filtro Usando Contexto Global”await db.set('config:desconto_min', 1000);await db.set('produto:1', { nome: 'Laptop', preco: 2500 });await db.set('produto:2', { nome: 'Mouse', preco: 50 });await db.set('produto:3', { nome: 'Monitor', preco: 800 });
// Produtos elegíveis para desconto (baseado na configuração)const produtosDesconto = await db.custom((value, key, allData) => { if (!key.startsWith('produto:')) return false;
const descontoMin = allData['config:desconto_min'] || 0; return value.preco >= descontoMin;});
console.log(produtosDesconto); // Apenas LaptopFiltro com Relacionamentos
Section titled “Filtro com Relacionamentos”// Dados relacionadosawait db.set('user:1', { nome: 'João', departamento_id: 1 });await db.set('user:2', { nome: 'Maria', departamento_id: 2 });await db.set('user:3', { nome: 'Pedro', departamento_id: 1 });await db.set('dept:1', { nome: 'TI', ativo: true });await db.set('dept:2', { nome: 'RH', ativo: false });
// Usuários de departamentos ativosconst usuariosDeptAtivos = await db.custom((value, key, allData) => { if (!key.startsWith('user:')) return false;
const deptKey = `dept:${value.departamento_id}`; const departamento = allData[deptKey];
return departamento && departamento.ativo === true;});
console.log(usuariosDeptAtivos); // Apenas João e PedroFiltro com Agregações
Section titled “Filtro com Agregações”const pedidos = { 'order:1': { cliente_id: 1, valor: 100, status: 'completo' }, 'order:2': { cliente_id: 1, valor: 200, status: 'completo' }, 'order:3': { cliente_id: 2, valor: 50, status: 'pendente' }, 'order:4': { cliente_id: 2, valor: 150, status: 'completo' }};
for (const [key, value] of Object.entries(pedidos)) { await db.set(key, value);}
// Clientes com pedidos completos > R$ 250const clientesVip = await db.custom((value, key, allData) => { if (!key.startsWith('order:')) return false;
// Calcular total de pedidos completos do cliente const totalCliente = Object.entries(allData) .filter(([k, v]) => k.startsWith('order:') && v.cliente_id === value.cliente_id && v.status === 'completo' ) .reduce((sum, [k, v]) => sum + v.valor, 0);
return totalCliente > 250;});
console.log(clientesVip); // Pedidos do cliente 1Funções Utilitárias
Section titled “Funções Utilitárias”// Função para filtros condicionais encadeadosasync function filtroCondicional(condicoes) { return await db.custom((value, key, allData) => { return condicoes.every(condicao => { return condicao(value, key, allData); }); });}
// Exemplo de usoconst condicoes = [ (value, key) => key.startsWith('user:'), (value) => value.idade >= 18, (value) => value.ativo === true];
const usuariosAdultosAtivos = await filtroCondicional(condicoes);
// Função para filtro com score personalizadoasync function filtroComScore(calculoScore, scoreMinimo) { return await db.custom((value, key, allData) => { const score = calculoScore(value, key, allData); return score >= scoreMinimo; });}
// Exemplo: Score baseado em múltiplos fatoresconst calcularScore = (value, key) => { if (!key.startsWith('user:')) return 0;
let score = 0; if (value.idade > 25) score += 10; if (value.ativo) score += 20; if (value.premium) score += 15;
return score;};
const usuariosScore = await filtroComScore(calcularScore, 25);- Oferece máxima flexibilidade para filtros complexos
- A função recebe acesso a todos os dados do banco
- Pode ser usado para implementar lógica de negócio complexa
- Performance pode ser afetada com grandes datasets
- Útil para filtros que envolvem múltiplas chaves ou cálculos
- Retorna um objeto com chave-valor (não um array)
- Se nenhum registro atender aos critérios, retorna um objeto vazio