集計パイプラインを実行する
項目一覧
MongoDB Shell を使用して、コレクションに対して集約パイプラインを実行できます。集約パイプラインは、選択したパイプライン ステージに基づいてドキュメントを集約結果に変換します。
集計の一般的な用途には、次のようなものがあります。
特定の式でデータをグループ化します。
複数のフィールドに基づいて結果を計算し、その結果を新しいフィールドに保存します。
データをフィルタリングして、指定された条件に一致するサブセットを返します。
データをソートします。
集計を実行すると、MongoDB Shell は結果を直接ターミナルに出力します。
集計シンタックスの理解
MongoDB 集約パイプラインはステージで構成されています。各ステージは、パイプラインを通過する際にドキュメントを変換します。パイプライン ステージでは、入力ドキュメントごとに1つの出力ドキュメントを生成する必要はありません。たとえば、一部のステージでは、新しいドキュメントを生成したり、ドキュメントをフィルタリングしたりする場合があります。
集約パイプラインを作成するには、MongoDB Shell で次の構文を使います。
1 db.<collection>.aggregate([ 2 { 3 <$stage1> 4 }, 5 { 6 <$stage2> 7 } 8 ... 9 ])
例
このページの例は、Atlas サンプル データセットを参照しています。無料の MongoDB Atlas クラスターを作成し、そのクラスターにサンプル データを入力して、以下の例に従うことができます。詳細については、「Atlas スタートガイド」を参照してください。
以下の例では、Atlas sample_mflix サンプル データセットの movies
コレクションを使用します。
ドキュメントの例
movies
コレクション内の各ドキュメントは映画について記述しています。
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 }
このチュートリアルで集約されたドキュメントは、 sample_mflix.movies
コレクションに存在します。このコレクションを含むデータベースに切り替えるには、次のコマンドを使用します。
use sample_mflix
集約パイプラインの例
次のパイプラインについて考えてみましょう。
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 ] )
このパイプラインは 4 段階で集約を行います。
- 第 1 ステージ
$project
ステージは、以下のフィールドを含むドキュメントを次のパイプライン ステージに渡します。genres
imdb
title
これらのフィールドをすべて含まないコレクションのドキュメントは、次のパイプライン ステージに渡されません。
注意
$project
ステージでは、次のステージに渡すドキュメントから_id
フィールドを非表示にする_id: 0
を指定します。詳細については、『 MongoDB マニュアル』を参照してください。
$project
ステージはサンプル ドキュメントを変換し、以下の出力を次のパイプライン ステージに渡します。1 { 2 imdb: { rating: 8.2, votes: 419589, id: 83658 }, 3 genres: [ 'Sci-Fi', 'Thriller' ], 4 title: 'Blade Runner' 5 } - 第 2 ステージ
$unwind
ステージは、genres
配列内の各要素のドキュメントを次のパイプライン ステージに渡します。$unwind
ステージは、元のサンプル ドキュメントから次の 2 つのドキュメントを生成し、次のパイプライン ステージに渡します。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 } - 第 3 ステージ
$group
ステージ:前のパイプライン ステージから受け取ったドキュメントから、明確なジャンル値を検索します、
それぞれのジャンルごとにドキュメントを作成し、
_id
をジャンル名とします、新しい各ドキュメントに、フィールド
averageGenreRating
を追加し、ここにジャンルに一致するすべてのドキュメントの平均imdb.rating
を含めます、新しいドキュメントを次のパイプライン ステージに渡します。
このステージでは、以下ようなドキュメントを次のパイプライン ステージに送ります。
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 } - 第 4 ステージ
$sort
ステージは、前のステージから受け取ったドキュメントを、averageGenreRating
フィールドの値に基づいて降順で並べ替えます。
サンプル パイプラインを実行すると、MongoDB Shell は次のようなドキュメントをターミナルに出力します。
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
以下も参照してください。
利用可能な集計ステージの詳細については、「 集計パイプライン ステージ」を参照してください。
ステージ内で使用できる集計演算子の詳細については、「 集計パイプライン演算子」を参照してください。