Mongodb: como agrupar e somar
Você pode usar a seguinte sintaxe para agrupar e contar no MongoDB:
db.collection.aggregate([ { $group : { _id : " $field_name1 ", count :{ $sum : " $field_name2 "}}} ])
Observe que field_name1 é o campo pelo qual você deseja agrupar e field_name2 é o campo que você deseja somar.
Os exemplos a seguir mostram como usar essa sintaxe com uma equipe de cobrança com os seguintes documentos:
db.teams.insertOne({team: " Mavs ", position: " Guard ", points: 31 }) db.teams.insertOne({team: " Spurs ", position: " Forward ", points: 22 }) db.teams.insertOne({team: " Rockets ", position: " Center ", points: 19 }) db.teams.insertOne({team: " Warriors ", position: " Forward ", points: 26 }) db.teams.insertOne({team: " Cavs ", position: " Guard ", points: 33 })
Exemplo 1: agrupar por e soma
Podemos usar o código a seguir para agrupar por campo “posição” e contar a soma dos pontos de cada posição.
db.teams.aggregate([ { $group : { _id : " $position ", count :{ $sum : " $points "}}} ])
Isso retorna os seguintes resultados:
{ _id: ' Forward ', count: 48 } { _id: ' Guard ', count: 64 } { _id: ' Center ', count: 19 }
Isso nos diz:
- Os jogadores na posição “Atacante” somam 48 pontos no total.
- Os jogadores com a posição “Guarda” somam 64 pontos no total.
- Os jogadores na posição “Centro” têm um total de 19 pontos.
Exemplo 2: agrupar por e adicionar (depois classificar)
Podemos usar o código a seguir para encontrar a soma dos pontos de cada posição e classificar automaticamente os resultados em ordem crescente :
db.teams.aggregate([ { $group : { _id : " $position ", count :{ $sum : " $points "}}}, { $sort : { count : 1}} ])
Isso retorna os seguintes resultados:
{ _id: ' Center ', count: 19 } { _id: ' Forward ', count: 48 } { _id: ' Guard ', count: 64 }
Os resultados são classificados por pontos em ordem crescente (do menor para o maior).
Podemos usar -1 no argumento count para classificar os resultados em ordem decrescente :
db.teams.aggregate([ { $group : { _id : " $position ", count :{ $sum : " $points "}}}, { $sort : { count :-1}} ])
Isso retorna os seguintes resultados:
{ _id: ' Guard ', count: 64 } { _id: ' Forward ', count: 48 } { _id: ' Center ', count: 19 }
Observe que os resultados são classificados por pontos em ordem decrescente (do maior para o menor).
Nota : Você pode encontrar a documentação completa do $group aqui .
Recursos adicionais
Os tutoriais a seguir explicam como realizar outras operações comuns no MongoDB:
MongoDB: Como contar valores distintos em um campo
MongoDB: Como agrupar por vários campos
MongoDB: Como agrupar e contar