Introdução
Neste artigo vou apresentar-lhe o grupo Mongodb por múltiplos campos. Para entender melhor primeiro vamos aprender sobre a função de agregação.
Função de Agregação MongoDB
Funções de agregação são usadas nas cláusulas GROUP BY para agregar dados agrupados. As funções de agregação funcionam melhor quando usadas com a cláusula GROUP BY. Entretanto, o uso de funções agregadas não se limita a consultas agrupadas.
Quando uma função agregada é usada em uma consulta sem a cláusula GROUP BY, a função agregada agrega todo o conjunto de resultados (todas as linhas que combinam com a cláusula WHERE). Se você não utilizar a cláusula GROUP BY, algumas funções agregadas na lista SELECT só podem ser utilizadas com outras funções agregadas. É por isso que a função agregar deve usar a cláusula GROUP BY para se conectar à lista na lista SELECT.
Por exemplo, em vez de usar a cláusula GROUP BY, o AVG em uma lista SELECT só pode corresponder à SUM, mas não pode corresponder a uma coluna específica.
A operação de agregação MongoDB é usada para operações em lote nos dados. Depois que a coleta é agrupada por condição, uma série de operações como soma, média e outras são executadas. As operações de agregação podem executar operações complexas de coleta, especialmente para estatísticas matemáticas e mineração de dados.
A entrada da operação de agregação no MongoDB é o documento de coleta. A saída pode ser um ou mais documentos. MongoDB oferece uma operação de agregação muito poderosa que pode ser dividida em três categorias:
- Oleoduto de agregação
- Operação de agregação para uso único
- MapaReduzir modelo de programação
Grupo de Mongodb por Múltiplos Campos
O operador do grupo $ é um agregador que retorna um novo documento. Ele tem seu próprio operador, nós podemos obter o campo do documento atual pelo símbolo $ + nome do campo. Para entender o grupo MongoDB por campos múltiplos primeiro, vamos dar uma olhada numa lista de todos os operadores que podem ser usados em $ group:
- $ sum – Retorna a soma de todos os campos numéricos.
- $ avg – Calcula a média entre os campos numéricos.
- $ min – Retorna o valor mínimo do campo numérico
- $ max – Obtém o valor máximo do campo numérico.
- $ push – Insere o valor do campo no campo de resultado
- $ addToSet – Insere um valor em um array do documento resultante, mas não cria duplicatas.
- $ first – Obtém apenas o primeiro documento dos agrupados, geralmente para ordenação.
- $ last – Retorna o último documento.
O pipeline de agregação
No modo POSIX multithreaded, existe um método chamado pipeline, cujo fluxo de elementos de dados é executado sequencialmente por um conjunto de threads na ordem especificada. Após processar o documento em uma etapa, o pipeline de agregação transfere o resultado do processamento para a etapa seguinte.
Função tubo de polímero Filtrar o documento para descobrir quais documentos satisfazem os critérios. Converter o documento e modificar a forma de saída do documento.
Cada nível do pipeline de agregação é definido usando operadores de etapa, e cada operador de etapa pode usar operadores de expressão para calcular a soma, média, concatenação, ou quebras de linha antes de cada nível. O resultado é retornado no final e o resultado retornado pode ser diretamente produzido ou salvo para a coleta.
Fluxo de processamento
- Db.coleta.agregado () pode usar vários canais ao mesmo tempo para processamento de dados.
- Db.collection.aggregate () utiliza as operações nativas do MongoDB para agregar e suportar eficazmente operações tais como GroupBy em SQL sem ter de escrever rotinas JS personalizadas.
- Cada fase do pipeline limita 100 MB de memória. Se um pipeline de nó único exceder o limite, o MongoDB gera um erro. Para processar grandes quantidades de dados, configure a propriedade allowDiskUse para true para gravar dados em um arquivo temporário para um nó de pipe agregado e permitir um limite de memória de 100 MB.
- Db.collection.aggregate () pode ser aplicado a uma série de fatias, mas o resultado não pode ser perdido na série de fatias. MapReduce pode ser aplicado a uma série de fatias, e o resultado pode ser perdido em uma série de fatias.
- Db.collection.aggregate () retorna um cursor, os dados são armazenados na memória e podem ser gerenciados diretamente como MongoShell.
- A saída do db.collection.aggregate () só pode ser salva em um documento, e o tamanho do documento BSON é limitado a 16 MB.
Método de agrupamento
Usar o método de grupo é similar a usar a cláusula GROUP BY em SQL. O método de grupo tem três parâmetros:
- Key: Exibe a chave do grupo
- Initial: Inicializa o campo do documento que representa o grupo de documentos
- Reduzir: Uma função que retorna o número de elementos. Esta função usa dois parâmetros como argumentos: o elemento atual e o documento de resultado agregado para o grupo atual.
- Keyf: parâmetro opcional. Use uma função diferente do argumento chave para representar o objeto chave de retorno.
- Cond: parâmetro opcional. Especifica que a condição deve retornar verdadeiro, caso contrário o documento não participará do agrupamento. Se este parâmetro não for especificado, todos os documentos participam do agrupamento.
- Finalizar: parâmetro opcional. Isto representa uma função que é acionada antes de retornar um resultado agrupado.
Por exemplo:`
js> db.users.group ({chave: {nome : true}, inicial: {total : 0},reduzir : função (curr, res){res.total += 1}})`
Vamos dar uma olhada na expressão. O parâmetro chave especifica que o grupo será agrupado por nome: key: {name: true}
O valor do parâmetro inicial inicializa os campos que representam o documento de resultado para o grupo. Neste caso, o valor inicial do campo total é definido. Este campo indica o número de elementos do grupo. Como não pode haver nenhum elemento, inicializamos a zero.
O parâmetro reduzir representa uma função onde o parâmetro corrente aponta para o objeto atual no grupo e res representa o grupo atual. Se você encontrar outro objeto com um valor específico para o campo nome, adicione esse documento ao grupo e aumente o valor total no documento res em 1.
O uso de $group
O $group usa _id para especificar o nome chave a ser agrupado, usando as estatísticas personalizadas do campo. Usando a operação agregada irá limpar o conceito de grupo Mongodb por múltiplos campos.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
db.users.aggregate({
$match : { idade: { $gte : 18 } } },{ $grupo : { _id:$nome do usuário, contagem:{$sum:1} } }); // grupo Mongodb por múltiplos campos db.users.aggregate({ $match: {age: {$gte:18} }, $grupo: {_id:{nome:$nome do usuário, idade:$ge}, ‘contar’:{$sum:1} } }) // $sum:val Adicionar val a cada documento // $avg:val Média do valor de cada documento db.users.aggregate({ $group: { _id:$nome do usuário, contagem:{$avg:$age} } }) db.users.aggregate({ $group: { _id:$nome do usuário, contagem:{$max:$age} } }) db.users.aggregate({ $group: {_id:$nome do usuário, contagem:{$min:$age} } }) / $first:val Torne-se o primeiro no grupo db.users.aggregate({ $group:{_id:$nome do usuário, contagem:{$first: $age} }) db.users.aggregate({ $group:{_id:$username, contagem:{$last: $age} } }) db.users.aggregate({ $group:{_id:$username, contagem:{$addToSet: $age}}) db.users.aggregate({ $group:{_id:$username, count:{$push: $age} } }) |
>
Grupo Mongodb por múltiplos campos usando a operação Aggregate
Primeiro, a chave na qual o agrupamento é baseado é selecionada e então a coleção é dividida em grupos de acordo com o valor da chave selecionada. Pode-se então criar um documento final agregando os documentos em cada grupo.
O grupo não suporta clusters fragmentados e não pode realizar clustering de fragmentação. Se você precisar de suporte distribuído, você deve usar agregado ou mapReduce.
1
2 3 4 5 6 7 8 9 10 666>11 12 13 > |
db.collection.group(document)
{ # Campo de agrupamento key:{key1, key2:1}, # Condições de consulta cond:{}, # Função agregada reduce:function(current, result){}, # initialization initial:{}, # Counting Return Function Set finalize:function(){} } |
Calcular o número de itens em cada coluna
1
2 3 4 5 6>6 7 8 9 > > |
SELECT COUNT(*) DE GRUPO DE BENS POR CATEGORIA_ID;
db.goods.group({ key:{category_id:1}, cond:{},// todos juntos reduce:function(current, result){// Correspondendo à corrente line,result Correspondendo a múltiplas linhas no grupo result.total += 1; }, inicial:{total:0} }) |
Conclusão
Este artigo foi escrito para os desenvolvedores entenderem o grupo Mongodb por múltiplos campos usando a função agregada. Se você achar este artigo útil, continue visitando Object Rocket para mais artigos relacionados à base de dados.
Se você precisar de conselhos ou ajuda no gerenciamento da segurança, escalabilidade, ou backups da sua base de dados, por favor não hesite em contactar-nos em Object Rocket.