Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Agrupar dados com o padrão outlier

Nesta página

  • Antes de começar
  • Prós
  • Contras
  • Sobre esta tarefa
  • Passos
  • Identifique um limite para discrepâncias (outliers)
  • Decida como lidar com discrepâncias
  • Adicione um indicador para documentos discrepantes
  • Armazene vendas adicionais em uma coleção separada
  • Resultados
  • Atualizações sobre Outliers
  • Saiba mais

Se sua coleção armazena documentos do mesmo tamanho e formato, um documento drasticamente diferente (um valor atípico) pode causar problemas de desempenho para querys comuns.

Considere uma coleção que armazena um campo de array. Se um documento contiver muito mais elementos de array do que outros documentos da coleção, talvez seja necessário tratá-lo de maneira diferente no seu esquema.

Use o padrão de discrepância (outlier) para isolar documentos que não correspondam ao formato esperado em comparação ao restante da sua coleção. Seu esquema ainda mantém todos os mesmos dados, mas as queries comuns não são afetadas por um único documento grande.

Antes de modificar seu esquema para lidar com outliers, considere os prós e os contras do padrão de outlier:

O padrão de discrepância (outlier) melhora o desempenho de queries executadas com frequência. As queries que retornam documentos típicos não precisam retornar também documentos discrepantes grandes.

O padrão discrepante também lida com casos extremos no aplicativo. Por exemplo, se seu aplicativo normalmente exibe 50 resultados de uma matriz, não haverá um documento que contenha 2.000 resultados que interrompa a experiência do usuário.

O padrão outlier requer lógica mais complexa para lidar com atualizações. Se você precisar atualizar seus dados com frequência, convém considerar outros padrões de design de esquema. Para obter mais informações, consulte Atualizações para outliers.

Considere um esquema que rastreia as vendas de livros. Documentos típicos na coleção terão a seguinte aparência:

db.sales.insertOne(
{
"_id": 1,
"title": "Invisible Cities",
"year": 1972,
"author": "Italo Calvino",
"customers_purchased": [ "user00", "user01", "user02" ]
}
)

A matriz customers_purchased é ilimitada, o que significa que, à medida que mais clientes compram um livro, a matriz fica maior. Para a maioria dos documentos, isso não é um problema porque a loja não espera mais do que algumas vendas para um determinado livro.

Suponha que um livro novo e popular resulte em um grande número de compras. O design do esquema atual resulta em um documento inchado, o que impacta negativamente o desempenho. Para resolver esse problema, implemente o padrão de discrepância para documentos que não tenham uma quantidade típica de vendas.

1

Dada a estrutura típica do documento do esquema, identifique quando um documento se torna um outlier. O limite pode ser baseado nas exigências da interface do usuário do seu aplicativo ou nas consultas que você executa em seus documentos.

Neste exemplo, um livro com mais de 50 vendas é discrepante.

2

Ao lidar com arrays grandes, uma maneira comum de lidar com valores atípicos é armazenar valores além do limite em uma coleção separada. Para livros com mais de 50 vendas, armazene os valores de customers_purchased extras em uma coleção separada.

3

Para livros com mais de 50 vendas, adicione um novo campo de documento chamado has_extras e defina o valor como true. Esse campo indica que há mais vendas armazenadas em uma coleção separada.

db.sales.insertOne(
{
"_id": 2,
"title": "The Wooden Amulet",
"year": 2023,
"author": "Lesley Moreno",
"customers_purchased": [ "user00", "user01", "user02", ... "user49" ],
"has_extras": true
}
)
4

Crie uma coleção chamada extra_sales para armazenar vendas além das 50 inicial. Vincule documentos da coleção extra_sales à coleção sales com uma referência:

db.extra_sales.insertOne(
{
"book_id": 2,
"customers_purchased_extra": [ "user50", "user51", "user52", ... "user999" ]
}
)

O padrão outlier impede que documento atípicos impacto o desempenho da query. O esquema resultante evita documento grandes na coleção e, ao mesmo tempo, mantém uma lista completa de vendas.

Considere uma página de aplicativo que mostre informações sobre um livro e todos os usuários que compraram esse livro. Depois de implementar o padrão de discrepância, a página exibe informações para a maioria dos livros (documentos típicos) rapidamente.

Para livros populares (outliers), o aplicativo realiza uma query adicional na coleção extra_sales em book_id. Para melhorar o desempenho desta consulta, você pode criar um índice no campo book_id.

Você precisa lidar com atualizações para documentos atípicos de forma diferente dos documentos típicos. A lógica usada para executar atualizações depende do design do esquema.

Para executar atualizações para outliers para o esquema anterior, implemente a seguinte lógica de aplicativo:

  • Verifique se o documento que está sendo atualizado tem has_extras definido como true.

    • Se has_extras estiver ausente ou for false, adicione as novas compras à coleção sales.

      • Se a array customers_purchased resultante contiver mais de 50 elementos, defina has_extras como true.

    • Se has_extras for true, adicione as novas compras à coleção sales_extras para o book_id correspondente.

  • Agrupar dados com padrão de Bucket

  • Evite arrays ilimitadas

  • Dados incorporados versus referências

  • Armazenar dados computados

Voltar

Padrão de bucket