distinct
distinct()
Section titled “distinct()”Retorna uma lista de valores únicos encontrados em um campo específico, eliminando duplicatas e fornecendo uma visão clara dos dados únicos armazenados.
Sintaxe
Section titled “Sintaxe”await db.distinct(field: string, key?: string): Promise<any[]>Parâmetros
Section titled “Parâmetros”field(obrigatório): Nome do campo para buscar valores únicoskey(opcional): Chave específica para buscar em array ou objeto
Retorno
Section titled “Retorno”Array contendo todos os valores únicos encontrados no campo especificado.
Exemplos
Section titled “Exemplos”Valores Únicos em Dados de Usuários
Section titled “Valores Únicos em Dados de Usuários”await db.set('user.123', { name: 'João', age: 25, city: 'São Paulo', role: 'admin' });await db.set('user.456', { name: 'Maria', age: 30, city: 'Rio de Janeiro', role: 'user' });await db.set('user.789', { name: 'Pedro', age: 25, city: 'São Paulo', role: 'user' });await db.set('user.101', { name: 'Ana', age: 35, city: 'Belo Horizonte', role: 'admin' });
// Buscar todas as cidades únicasconst cities = await db.distinct('city');console.log(cities);// ['São Paulo', 'Rio de Janeiro', 'Belo Horizonte']
// Buscar todas as idades únicasconst ages = await db.distinct('age');console.log(ages);// [25, 30, 35]
// Buscar todos os roles únicosconst roles = await db.distinct('role');console.log(roles);// ['admin', 'user']Distinct em Array Específico
Section titled “Distinct em Array Específico”await db.set('products', [ { id: 1, name: 'Notebook', category: 'Electronics', brand: 'Dell' }, { id: 2, name: 'Mouse', category: 'Electronics', brand: 'Logitech' }, { id: 3, name: 'Chair', category: 'Furniture', brand: 'IKEA' }, { id: 4, name: 'Keyboard', category: 'Electronics', brand: 'Dell' }, { id: 5, name: 'Desk', category: 'Furniture', brand: 'IKEA' }]);
// Buscar categorias únicas nos produtosconst categories = await db.distinct('category', 'products');console.log(categories);// ['Electronics', 'Furniture']
// Buscar marcas únicas nos produtosconst brands = await db.distinct('brand', 'products');console.log(brands);// ['Dell', 'Logitech', 'IKEA']Análise de Dados de E-commerce
Section titled “Análise de Dados de E-commerce”await db.set('orders', [ { orderId: '001', status: 'delivered', paymentMethod: 'credit_card', amount: 150.00 }, { orderId: '002', status: 'pending', paymentMethod: 'pix', amount: 75.50 }, { orderId: '003', status: 'delivered', paymentMethod: 'credit_card', amount: 200.00 }, { orderId: '004', status: 'cancelled', paymentMethod: 'debit_card', amount: 99.90 }, { orderId: '005', status: 'delivered', paymentMethod: 'pix', amount: 300.00 }]);
// Analisar status únicos dos pedidosconst orderStatuses = await db.distinct('status', 'orders');console.log('Status disponíveis:', orderStatuses);// ['delivered', 'pending', 'cancelled']
// Métodos de pagamento únicosconst paymentMethods = await db.distinct('paymentMethod', 'orders');console.log('Métodos de pagamento:', paymentMethods);// ['credit_card', 'pix', 'debit_card']Combinando com Outros Métodos
Section titled “Combinando com Outros Métodos”// Primeiro, obter valores únicosconst uniqueRoles = await db.distinct('role');console.log('Roles únicos:', uniqueRoles);
// Depois, contar quantos usuários têm cada rolefor (const role of uniqueRoles) { const count = await db.compare('role', '==', role); console.log(`${role}: ${count.length} usuários`);}
// Ou usar agregação para análise completaconst roleStats = await db.aggregate([ { type: 'distinct', field: 'role' }, { type: 'count' }]);console.log('Estatísticas de roles:', roleStats);Casos de Uso
Section titled “Casos de Uso”📊 Análise de Dados
Section titled “📊 Análise de Dados”// Dashboard de vendas - categorias de produtosconst productCategories = await db.distinct('category', 'inventory');
// Relatório de clientes - países únicosconst countries = await db.distinct('country', 'customers');🎯 Filtros Dinâmicos
Section titled “🎯 Filtros Dinâmicos”// Criar filtros para interface de usuárioconst availableFilters = { brands: await db.distinct('brand', 'products'), sizes: await db.distinct('size', 'products'), colors: await db.distinct('color', 'products')};📈 Relatórios Estatísticos
Section titled “📈 Relatórios Estatísticos”// Análise de comportamento de usuáriosconst uniqueDevices = await db.distinct('device', 'userSessions');const uniqueLocations = await db.distinct('location', 'userSessions');
console.log(`Acessos de ${uniqueDevices.length} tipos de dispositivos diferentes`);console.log(`Usuários de ${uniqueLocations.length} localizações diferentes`);Características Importantes
Section titled “Características Importantes”✅ Eliminação de Duplicatas
Section titled “✅ Eliminação de Duplicatas”- Remove automaticamente valores duplicados
- Preserva a ordem de primeira ocorrência
- Funciona com qualquer tipo de dados
🚀 Performance Otimizada
Section titled “🚀 Performance Otimizada”- Processamento eficiente para grandes conjuntos de dados
- Utiliza estruturas de dados otimizadas internamente
- Cache inteligente para consultas repetidas
🔍 Flexibilidade de Busca
Section titled “🔍 Flexibilidade de Busca”- Suporta busca em objetos globais ou arrays específicos
- Funciona com campos aninhados usando notação de ponto
- Compatível com qualquer tipo de valor
Validação e Erros
Section titled “Validação e Erros”// ❌ Erro: Campo obrigatório não fornecidotry { await db.distinct();} catch (error) { console.log(error.message); // "Field parameter is required"}
// ❌ Erro: Chave não existeconst result = await db.distinct('nonexistent', 'invalidKey');console.log(result); // []
// ✅ Campo não existe em alguns registrosawait db.set('mixed.1', { name: 'João', age: 25 });await db.set('mixed.2', { name: 'Maria' }); // sem campo 'age'
const ages = await db.distinct('age');console.log(ages); // [25] - ignora registros sem o campoMétodos Relacionados
Section titled “Métodos Relacionados”count()- Conta registros específicossum()- Soma valores numéricosavg()- Calcula média dos valoresmin()- Encontra o menor valormax()- Encontra o maior valoraggregate()- Operações estatísticas incluindo distinct
Dicas de Performance
Section titled “Dicas de Performance”// ✅ Use distinct para análises rápidasconst quickAnalysis = await db.distinct('category');
// ✅ Combine com agregação para dados completosconst fullAnalysis = await db.aggregate([ { type: 'distinct', field: 'category' }, { type: 'count' }]);
// ✅ Cache resultados para uso repetidoconst categories = await db.distinct('category');// Use 'categories' múltiplas vezes sem re-consultar