4 min de leitura
#19 - Agregação Básica no MongoDB
Breve explicação sobre agregações no MongoDB.
Operações de agregações processam os dados registrados e retornam um resultado agregado. Agregações agrupam valores vindos de múltiplos documentos reunidos, e podem estabelecer uma variedade de operações sobre esta agrupação de dados para retornar um resultado único. O sql count(*)
e group by
são equivalentes a uma agregação no MongoDB.
O método aggregate()
Para agregar valores do MongoDB você precisa usar o método aggregate()
.
Sintaxe
A sintaxe básica do método aggregate()
é a seguinte:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Exemplo
Suponha que dentro da coleção mycol você tem os seguintes dados:
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
}
Dada a coleção acima se você quiser exibir uma lista de quantos tutoriais são escritos por cada usuário, então você usará o método aggregate()
mostrado a seguir:
$ db.mycol.aggregate([{$group: {_id: "$by_user", num_tutorial: {$sum: 1}}}])
{
result: [
{
_id: "tutorials point",
num_tutorial: 2
},
{
_id: "Neo4j",
num_tutorial: 1
}
],
ok: 1
}
A consulta SQL equivalente para o caso de uso acima deverá ser select by_user, count(*) from mycol group by by_user
No exemplo acima temos um agrupamento de documentos por meio do campo by_user e sobre cada ocorrência deste campo um valor prévio de soma é incrementado.
Esta é a lista de expressões de agregações disponíveis.
Expressão | Descrição | Exemplo |
---|---|---|
$sum | Soma o valor definido a partir de todos os documentos da coleção. | db.mycol.aggregate([{$group:{_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}]) |
$avg | Calcula a média de todos os valores dados de todos os documentos da coleção. | db.mycol.aggregate([{$group:{_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}]) |
$min | Obtém o mínimo dos valores correspondentes de todos os documentos da coleção. | db.mycol.aggregate([{$group:{_id : “$by_user”, num_tutorial : {$min : “$likes”}}}]) |
$max | Obtém o máximo dos valores correspondentes de todos os documentos da coleção. | db.mycol.aggregate([{$group:{_id : “$by_user”, num_tutorial : {$max : “$likes”}}}]) |
$push | Insere o valor para um array no documento resultante. | db.mycol.aggregate([{$group:{_id : “$by_user”, url : {$push: “$url”}}}]) |
$addToSet | Insere o valor para um array no documento resultante mas não faz criações duplicadas. | db.mycol.aggregate([{$group:{_id : “$by_user”, url : {$addToSet : “$url”}}}]) |
$first | Obtém o primeiro documento vindo de conjunto de documentos da agregação. Tipicamente isto só faz sentido quando vem junto de aplicação prévia de alguma ordenação “$sort”. | db.mycol.aggregate([{$group:{_id : “$by_user”, first_url : {$first : “$url”}}}]) |
$last | Obtém o último documento vindo de conjunto de documentos da agregação. Tipicamente isto só faz sentido quando vem junto de aplicação prévia de alguma ordenação “$sort”. | db.mycol.aggregate([{$group:{_id : “$by_user”, last_url : {$last : “$url”}}}]) |
Fonte Traduzida: Tutorials Point – MongoDB Agregation
Comentários