Docs Menu
Docs Home
/
MongoDB Shell

集計パイプラインを実行する

項目一覧

  • 集計シンタックスの理解

MongoDB Shell を使用して、コレクションに対して集約パイプラインを実行できます。集約パイプラインは、選択したパイプライン ステージに基づいてドキュメントを集約結果に変換します。

集計の一般的な用途には、次のようなものがあります。

  • 特定の式でデータをグループ化します。

  • 複数のフィールドに基づいて結果を計算し、その結果を新しいフィールドに保存します。

  • データをフィルタリングして、指定された条件に一致するサブセットを返します。

  • データをソートします。

集計を実行すると、MongoDB Shell は結果を直接ターミナルに出力します。

MongoDB 集約パイプラインはステージで構成されています。各ステージは、パイプラインを通過する際にドキュメントを変換します。パイプライン ステージでは、入力ドキュメントごとに1つの出力ドキュメントを生成する必要はありません。たとえば、一部のステージでは、新しいドキュメントを生成したり、ドキュメントをフィルタリングしたりする場合があります。

集約パイプラインを作成するには、MongoDB Shell で次の構文を使います。

1db.<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

次のパイプラインについて考えてみましょう。

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] )

このパイプラインは 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

以下も参照してください。

戻る

削除