Puedes correr Canalizaciones de agregación en sus colecciones mediante MongoDB Shell. Las canalizaciones de agregación transforman sus documentos en resultados agregados según las etapas seleccionadas.
Los usos comunes de la agregación incluyen:
Agrupar datos mediante una expresión dada.
Calcular resultados basados en múltiples campos y almacenar esos resultados en un nuevo campo.
Filtrar datos para devolver un subconjunto que coincida con un criterio determinado.
Ordenar datos.
Cuando se ejecuta una agregación, MongoDB Shell envía los resultados directamente a la terminal.
Comprender la sintaxis de agregación
La canalización de agregación de MongoDB consta de etapas. Cada etapa transforma los documentos a medida que pasan por la canalización. Las etapas de la canalización no necesitan generar un documento de salida por cada documento de entrada; por ejemplo, algunas etapas pueden generar nuevos documentos o filtrarlos.
Para crear una canalización de agregación, utilice la siguiente sintaxis en MongoDB Shell:
1 db.<collection>.aggregate([ 2 { 3 <$stage1> 4 }, 5 { 6 <$stage2> 7 } 8 ... 9 ])
Ejemplo
Los ejemplos de esta página hacen referencia al conjunto de datos de muestra de Atlas. Puede crear un clúster de Atlas gratuito y rellenarlo con datos de muestra para seguir estos ejemplos. Para obtener más información sobre la configuración de implementaciones, consulte Introducción a MongoDB.
El siguiente ejemplo utiliza el movies colección en el conjunto de datos de muestra Atlas sample_mflix.
Documento de ejemplo
Cada documento de la colección movies describe una película:
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 }
Los documentos agregados en este tutorial residen en la colección sample_mflix.movies. Utilice el siguiente comando para cambiar a la base de datos que contiene esta colección:
use sample_mflix
Ejemplo de pipeline de agregación
Considere la siguiente tubería:
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 ] )
Esta canalización realiza una agregación en cuatro etapas:
- Primera etapa
La
$projectetapa pasa los documentos que contienen los siguientes campos a la siguiente etapa del pipeline:genresimdbtitle
Los documentos de la colección que no incluyen todos estos campos no pasan a la siguiente etapa del proceso.
Nota
La etapa
$projectespecifica_id: 0para suprimir el campo_idde los documentos que pasa a la siguiente etapa.Para obtener más información, consulte el Manual de MongoDB.
La etapa
$projecttransforma el documento de ejemplo y pasa la siguiente salida a la siguiente etapa de la canalización:1 { 2 imdb: { rating: 8.2, votes: 419589, id: 83658 }, 3 genres: [ 'Sci-Fi', 'Thriller' ], 4 title: 'Blade Runner' 5 } - Segunda etapa
La etapa pasa un documento por cada elemento de
$unwindlagenresmatriz a la siguiente etapa de la canalización.La etapa
$unwindgenera los dos documentos siguientes a partir del documento de ejemplo original y luego los pasa a la siguiente etapa del proceso: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 } - Tercera etapa
La etapa de
$group:Recupera los valores de género distintos de los documentos que recibe de la etapa anterior del pipeline.
Crea un documento para cada género distinto donde
_ides el nombre del género.Agrega un campo,
averageGenreRating, a cada nuevo documento que contiene el promedioimdb.ratingde todos los documentos que coinciden con el género, yPasa los nuevos documentos a la siguiente etapa del pipeline.
Esta etapa envía documentos similares a los siguientes a la siguiente etapa del proceso de canalización:
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 } - Cuarta Etapa
- La etapa ordena los documentos que recibe de la etapa anterior en orden descendente según el valor
$sortdelaverageGenreRatingcampo.
Cuando ejecuta la canalización de ejemplo, MongoDB Shell imprime documentos similares al siguiente en la 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 ]
Tip
Para obtener más información sobre las etapas de agregación disponibles, consulte Etapas de la canalización de agregación.
Para obtener más información sobre los operadores de agregación disponibles que puede utilizar dentro de las etapas, consulte Operadores de canalización de agregación.