Execute aggregation pipelines
Nesta página
Você pode executar os pipelines de agregação em suas coleções utilizando o MongoDB Shell. Os pipelines de agregação transformam seus documentos em resultados agregados com base em estágios de pipeline selecionados.
Os usos comuns para agregação incluem:
Agrupar dados por uma determinada expressão.
Calcular resultados com base em vários campos e armazenar esses resultados em um novo campo.
Filtrar dados para retornar um subconjunto que corresponda a um determinado critério.
Classificando dados.
Quando você executa uma agregação, o MongoDB Shell produz os resultados diretamente para o terminal.
Compreender a sintaxe de agregação
O pipeline de agregação MongoDB consiste em estágios. Cada estágio transforma os documentos à medida que eles passam pelo pipeline. Os estágios de pipeline não precisam produzir um documento de saída para cada documento de entrada; por exemplo, algumas etapas podem gerar novos documentos ou filtrar documentos.
Para criar um aggregation pipeline, use a seguinte sintaxe no MongoDB Shell:
1 db.<collection>.aggregate([ 2 { 3 <$stage1> 4 }, 5 { 6 <$stage2> 7 } 8 ... 9 ])
Exemplo
Os exemplos nesta página referenciam o conjunto de dados de amostra do Atlas. Você pode criar um cluster do Atlas gratuito e preencher este agrupamento com dados de amostra para acompanhar junto com estes exemplos. Para mais informações, consulte Iniciar com Atlas.
O exemplo abaixo utiliza a coleção movies
no conjunto de dados de amostra sample_mflix do Atlas.
Documento de exemplo
Cada documento na coleção movies
descreve um filme:
1 { 2 _id: 573a1397f29313caabce8347, 3 fullplot: 'In a cyberpunk vision of the future, man has developed the technology to create replicants, human clones used to serve in the colonies outside Earth but with fixed lifespans. In Los Angeles, 2019, Deckard is a Blade Runner, a cop who specializes in terminating replicants. Originally in retirement, he is forced to re-enter the force when four replicants escape from an off-world colony to Earth.', 4 imdb: { rating: 8.2, votes: 419589, id: 83658 }, 5 year: 1982, 6 plot: 'A blade runner must pursue and try to terminate four replicants who stole a ship in space and have returned to Earth to find their creator.', 7 genres: [ 'Sci-Fi', 'Thriller' ], 8 rated: 'R', 9 metacritic: 88, 10 title: 'Blade Runner', 11 lastupdated: '2015-09-04 00:05:51.990000000', 12 languages: [ 'English', 'German', 'Cantonese', 'Japanese', 'Hungarian' ], 13 writers: [ 14 'Hampton Fancher (screenplay)', 15 'David Webb Peoples (screenplay)', 16 'Philip K. Dick (novel)' 17 ], 18 type: 'movie', 19 tomatoes: { 20 viewer: { rating: 4, numReviews: 331213, meter: 91 }, 21 dvd: 1997-08-27T00:00:00.000Z, 22 critic: { rating: 8.5, numReviews: 102, meter: 90 }, 23 lastUpdated: 2015-09-12T17:48:21.000Z, 24 consensus: "Misunderstood when it first hit theaters, the influence of Ridley Scott's mysterious, neo-noir Blade Runner has deepened with time. A visually remarkable, achingly human sci-fi masterpiece.", 25 rotten: 10, 26 production: 'Warner Bros. Pictures', 27 fresh: 92 28 }, 29 poster: 'https://m.media-amazon.com/images/M/MV5BNzQzMzJhZTEtOWM4NS00MTdhLTg0YjgtMjM4MDRkZjUwZDBlXkEyXkFqcGdeQXVyNjU0OTQ0OTY@._V1_SY1000_SX677_AL_.jpg', 30 num_mflix_comments: 1, 31 released: 1982-06-25T00:00:00.000Z, 32 awards: { 33 wins: 13, 34 nominations: 15, 35 text: 'Nominated for 2 Oscars. Another 11 wins & 15 nominations.' 36 }, 37 countries: [ 'USA', 'Hong Kong', 'UK' ], 38 cast: [ 39 'Harrison Ford', 40 'Rutger Hauer', 41 'Sean Young', 42 'Edward James Olmos' 43 ], 44 directors: [ 'Ridley Scott' ], 45 runtime: 117 46 }
Os documentos agregados neste tutorial residem na coleção sample_mflix.movies
. Use o seguinte comando para alternar para o banco de dados que contém esta coleção:
use sample_mflix
Exemplo de aggregation pipeline
Considere o seguinte pipeline:
1 db.movies.aggregate([ 2 3 // First Stage 4 5 { $project: { _id: 0, genres: 1, imdb: 1, title: 1 } }, 6 7 // Second Stage 8 9 { $unwind: "$genres" }, 10 11 // Third Stage 12 13 { $group: 14 { _id: "$genres", 15 averageGenreRating: { $avg: "$imdb.rating" } 16 } 17 }, 18 19 // Fourth Stage 20 21 { $sort: { averageGenreRating: -1 } } 22 ] )
Este pipeline realiza uma agregação em quatro etapas:
- Primeira etapa
O estágio
$project
passa os documentos que contêm os seguintes campos para o próximo estágio do pipeline:genres
imdb
title
Documentos da coleção que não incluem todos esses campos não são passados para a próxima etapa do pipeline.
Observação
O estágio
$project
especifica_id: 0
para suprimir o campo_id
dos documentos que ele passa para o próximo estágio.Para obter mais informações, consulte o Manual do MongoDB.
O estágio
$project
transforma o documento de exemplo e passa a seguinte saída para o próximo estágio do pipeline:1 { 2 imdb: { rating: 8.2, votes: 419589, id: 83658 }, 3 genres: [ 'Sci-Fi', 'Thriller' ], 4 title: 'Blade Runner' 5 } - Segunda etapa
O estágio
$unwind
passa um documento para cada elemento no arraygenres
para o próximo estágio de pipeline.A etapa
$unwind
gera os dois documentos a seguir a partir do documento de exemplo original e, em seguida, os passa para a próxima etapa do pipeline:1 { 2 imdb: { rating: 8.2, votes: 419589, id: 83658 }, 3 genres: 'Sci-Fi', 4 title: 'Blade Runner' 5 } 1 { 2 imdb: { rating: 8.2, votes: 419589, id: 83658 }, 3 genres: 'Thriller', 4 title: 'Blade Runner' 5 } - Terceiro estágio
O estágio
$group
:Recupera os valores de gênero distintos dos documentos recebidos do estágio de pipeline anterior,
Cria um documento para cada gênero distinto onde o
_id
é o nome do gênero,Adiciona um campo,
averageGenreRating
, a cada novo documento que contém a média deimdb.rating
de todos os documentos que correspondem ao gênero ePassa os novos documentos para a próxima etapa do pipeline.
Este estágio envia documentos semelhantes aos seguintes para o próximo estágio do pipeline:
1 { _id: 'Sport', averageGenreRating: 6.781233933161954 }, 2 { _id: 'History', averageGenreRating: 7.202306920762287 }, 3 { _id: 'Biography', averageGenreRating: 7.097142857142857 }, 4 { _id: 'Adventure', averageGenreRating: 6.527788649706458 }, 5 { _id: 'Family', averageGenreRating: 6.36096256684492 }, 6 { _id: 'Crime', averageGenreRating: 6.730478683620045 }, 7 { _id: 'Western', averageGenreRating: 6.879197080291971 }, 8 { _id: 'Fantasy', averageGenreRating: 6.42495652173913 }, 9 { _id: 'Talk-Show', averageGenreRating: 7 }, 10 { _id: 'Documentary', averageGenreRating: 7.365266635205286 }, 11 { _id: 'War', averageGenreRating: 7.183944374209861 }, 12 { _id: 'Short', averageGenreRating: 7.355813953488372 }, 13 { _id: 'Horror', averageGenreRating: 5.84110718492344 }, 14 { _id: 'Film-Noir', averageGenreRating: 7.503809523809523 }, 15 { _id: 'News', averageGenreRating: 7.254901960784314 }, 16 { _id: 'Thriller', averageGenreRating: 6.322121555303888 }, 17 { _id: 'Action', averageGenreRating: 6.3774842271293375 }, 18 { _id: 'Music', averageGenreRating: 6.923452380952381 }, 19 { _id: 'Animation', averageGenreRating: 6.917993795243019 }, 20 { _id: 'Drama', averageGenreRating: 6.830528688822631 } - Quarto estágio
- O estágio
$sort
classifica os documentos que recebe do estágio anterior em ordem decrescente com base no valor do campoaverageGenreRating
.
Quando você executa o pipeline de exemplo, o MongoDB Shell imprime documentos semelhantes aos seguintes ao terminal:
1 [ 2 { _id: 'Film-Noir', averageGenreRating: 7.503809523809523 }, 3 { _id: 'Documentary', averageGenreRating: 7.365266635205286 }, 4 { _id: 'Short', averageGenreRating: 7.355813953488372 }, 5 { _id: 'News', averageGenreRating: 7.254901960784314 }, 6 { _id: 'History', averageGenreRating: 7.202306920762287 }, 7 { _id: 'War', averageGenreRating: 7.183944374209861 }, 8 { _id: 'Biography', averageGenreRating: 7.097142857142857 }, 9 { _id: 'Talk-Show', averageGenreRating: 7 }, 10 { _id: 'Music', averageGenreRating: 6.923452380952381 }, 11 { _id: 'Animation', averageGenreRating: 6.917993795243019 }, 12 { _id: 'Western', averageGenreRating: 6.879197080291971 }, 13 { _id: 'Drama', averageGenreRating: 6.830528688822631 }, 14 { _id: 'Sport', averageGenreRating: 6.781233933161954 }, 15 { _id: 'Crime', averageGenreRating: 6.730478683620045 }, 16 { _id: 'Musical', averageGenreRating: 6.696913580246913 }, 17 { _id: 'Romance', averageGenreRating: 6.695711554220159 }, 18 { _id: 'Mystery', averageGenreRating: 6.563317384370015 }, 19 { _id: 'Adventure', averageGenreRating: 6.527788649706458 }, 20 { _id: 'Comedy', averageGenreRating: 6.479626461362988 }, 21 { _id: 'Fantasy', averageGenreRating: 6.42495652173913 } 22 ]
Dica
Veja também:
Para saber mais sobre os estágios de agregação disponíveis, consulte Estágios do pipeline de agregação.
Para saber mais sobre os operadores de agregação disponíveis que você pode usar em estágios, consulte Operadores de pipeline de agregação.