MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Comparação de agregação do MongoDB:group(), $group e MapReduce


É um pouco confuso, pois os nomes são semelhantes, mas o group() O comando é um recurso e implementação diferente do $group operador de pipeline no Aggregation Framework.

O comando group(), Aggregation Framework e MapReduce são coletivamente recursos de agregação do MongoDB. Há alguma sobreposição de recursos, mas tentarei explicar as diferenças e limitações de cada um como no MongoDB 2.2.0.

Observação:conjuntos de resultados embutidos mencionadas abaixo referem-se a consultas que são processadas na memória com resultados retornados no final da chamada da função. Opções alternativas de saída (atualmente disponíveis apenas com MapReduce) podem incluir salvar resultados em uma coleção nova ou existente.

group() Comando


  • Sintaxe e funcionalidade simples para agrupar .. análoga a GROUP BY em SQL.

  • Retorna o conjunto de resultados inline (como uma matriz de itens agrupados).

  • Implementado usando o mecanismo JavaScript; personalizado reduce() funções podem ser escritas em JavaScript.

  • Limitações atuais

    • Não será agrupado em um conjunto de resultados com mais de 20.000 chaves.

    • Os resultados devem estar dentro das limitações de um documento BSON (atualmente 16 MB).

    • Recebe um bloqueio de leitura e não permite que nenhum outro thread execute JavaScript enquanto estiver em execução.

    • Não funciona com coleções fragmentadas.

  • Veja também:exemplos de comandos group() .

MapReduce


  • Implementa o modelo MapReduce para processar grandes conjuntos de dados.

  • Pode escolher entre uma das várias opções de saída (inline, nova coleção, mesclar, substituir, reduzir)

  • As funções MapReduce são escritas em JavaScript.

  • Oferece suporte a coleções de entrada não fragmentadas e fragmentadas.

  • Pode ser usado para agregação incremental em grandes coleções.

  • O MongoDB 2.2 implementa um suporte muito melhor para a saída de redução de mapa fragmentado.

  • Limitações atuais

    • Uma única emissão pode conter apenas metade do tamanho máximo do documento BSON do MongoDB (16 MB).

    • Há um bloqueio JavaScript para que um servidor mongod possa executar apenas uma função JavaScript em um determinado momento. No entanto, a maioria das etapas do MapReduce são muito curtas, portanto, os bloqueios podem ser gerados com frequência.

    • As funções MapReduce podem ser difíceis de depurar. Você pode usar print() e printjson() para incluir saída de diagnóstico no mongod registro.

    • O MapReduce geralmente não é intuitivo para programadores que tentam traduzir a experiência de agregação de consulta relacional.

  • Veja também:Exemplos de mapeamento/redução .

Estrutura de agregação


  • Novo recurso na versão de produção do MongoDB 2.2.0 (agosto de 2012).

  • Projetado com objetivos específicos de melhorar o desempenho e a usabilidade.

  • Retorna o conjunto de resultados inline.

  • Oferece suporte a coleções de entrada não fragmentadas e fragmentadas.

  • Usa uma abordagem de "pipeline" em que os objetos são transformados à medida que passam por uma série de operadores de pipeline, como correspondência, projeção, classificação e agrupamento.

  • Os operadores de pipeline não precisam produzir um documento de saída para cada documento de entrada:os operadores também podem gerar novos documentos ou filtrar documentos.

  • Usando projeções, você pode adicionar campos computados, criar novos subobjetos virtuais e extrair subcampos no nível superior dos resultados.

  • Os operadores de pipeline podem ser repetidos conforme necessário (por exemplo, vários $project ou $group degraus.

  • Limitações atuais

    • Os resultados são retornados em linha, portanto, são limitados ao tamanho máximo do documento suportado pelo servidor (16 MB)

    • Não suporta tantas opções de saída quanto MapReduce

    • Limitado a operadores e expressões suportados pelo Aggregation Framework (ou seja, não pode escrever funções personalizadas)

    • O mais novo recurso de servidor para agregação, portanto, tem mais espaço para amadurecer em termos de documentação, conjunto de recursos e uso.

  • Veja também:Exemplos de estrutura de agregação .

Alguém pode apresentar uma ilustração ou me guiar para um link onde esses três conceitos sejam explicados juntos, pegando os mesmos dados de amostra, para que eu possa compará-los facilmente?

Você geralmente não encontrará exemplos em que seria útil comparar todas as três abordagens, mas aqui estão as perguntas anteriores do StackOverflow que mostram variações:
  • group() versus estrutura de agregação
  • MapReduce versus estrutura de agregação