Menu Docs
Página inicial do Docs
/
MongoDB Shell

Execute aggregation pipelines

Nesta página

  • Compreender a sintaxe de agregação
  • Exemplo

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.

O aggregation pipeline 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:

1db.<collection>.aggregate([
2 {
3 <$stage1>
4 },
5 {
6 <$stage2>
7 }
8 ...
9])

Os exemplos nesta página referenciam o conjunto de dados de amostra do Atlas . Você pode criar um agrupamento de 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.

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

Considere o seguinte pipeline:

1db.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 array genres 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 de imdb.rating de todos os documentos que correspondem ao gênero e

  • Passa 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 campo averageGenreRating.

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:

← Exclua documentos