As operações de agregação processam registros de dados e retornam resultados computados. As operações de agregação agrupam valores de múltiplos documentos e podem realizar uma variedade de operações sobre os dados agrupados para retornar um único resultado. Na contagem SQL(*) e com agrupamento por é um equivalente da agregação MongoDB.
O método agregado()
Para a agregação no MongoDB, você deve usar o método agregado().
Sintaxe
Sintaxe básica do método aggregate() é como segue –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Exemplo
Na coleção 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: , 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: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},
Agregar a partir da coleção acima, se você quiser exibir uma lista indicando quantos tutoriais são escritos por cada usuário, então você usará o seguinte método agregado() –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
Sql consulta equivalente para o caso de uso acima será selecionado por_usuário, contagem(*) do grupo mycol por_usuário.
No exemplo acima, nós agrupamos documentos por campo por_usuário e em cada ocorrência de por usuário o valor anterior da soma é incrementado. Segue uma lista de expressões de agregação disponíveis.
Expressão | Descrição | Exemplo |
---|---|---|
$sum | Soma acima do valor definido de todos os documentos da coleção. | db.mycol.agregado() |
$avg | Calcula a média de todos os valores definidos de todos os documentos do acervo. | db.mycol.agregado() |
$min | Calcula o mínimo dos valores correspondentes de todos os documentos do acervo. | db.mycol.aggregate() |
$max | E obtém o máximo dos valores correspondentes de todos os documentos do acervo. | db.mycol.aggregate() |
$push | Insere o valor a um array no documento resultante. | db.mycol.aggregate() |
$addToSet | Insere o valor a um array no documento resultante mas não cria duplicatas. | db.mycol.aggregate() |
$first | Obtém o primeiro documento a partir dos documentos originais de acordo com o agrupamento. Normalmente isto só faz sentido junto com alguns previamente aplicados “$sort”-stage. | db.mycol.aggregate() |
$last | Pega o último documento dos documentos de origem de acordo com o agrupamento. Normalmente isto só faz sentido junto com alguns previamente aplicados “$sort”-stage. | db.mycol.aggregate() |
Pipeline Concept
No comando UNIX, shell pipeline significa a possibilidade de executar uma operação em alguma entrada e usar a saída como a entrada para o próximo comando e assim por diante. O MongoDB também suporta o mesmo conceito no framework de agregação. Há um conjunto de etapas possíveis e cada uma delas é tomada como um conjunto de documentos como um input e produz um conjunto de documentos resultante (ou o documento final JSON resultante no final do pipeline). Isto, por sua vez, pode ser usado para a próxima etapa e assim por diante.
Seguir-se-ão as possíveis etapas no framework de agregação –
-
$project – Usado para seleccionar alguns campos específicos de uma colecção.
-
$match – Esta é uma operação de filtragem e portanto pode reduzir a quantidade de documentos que são dados como entrada para a próxima etapa.
-
$group – Isto faz a agregação real como discutido acima.
-
$sort – Ordena os documentos.
-
$skip – Com isto, é possível saltar na lista de documentos para uma determinada quantidade de documentos.
-
$limite – Isto limita a quantidade de documentos a olhar, pelo número dado a partir das posições atuais.
-
$unwind – Isto é usado para desenrolar documentos que estão usando arrays. Quando se usa um array, os dados são tipo pré-juntos e esta operação será desfeita com isto para ter documentos individuais novamente. Assim com esta etapa aumentaremos a quantidade de documentos para a próxima etapa.