AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

db.コレクション.aggregate()(mongoshメソッド)

MongoDB とドライバー

このページでは、mongosh メソッドのドキュメントについて記載しています。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
db.collection.aggregate(pipeline, options)

コレクションまたはビュー内のデータの集計値を計算します。

次の値を返します。
  • 集計パイプラインの最終ステージ段階で作成されたドキュメント用のカーソル。

  • パイプラインに explain オプションが含まれている場合、クエリが返すドキュメントには集計操作の処理が詳述されています。

  • パイプラインに $out 演算子または $merge 演算子が含まれている場合、クエリは空のカーソルを返します。

次の環境でホストされる配置には db.collection.aggregate() を使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

db.collection.aggregate() の形式は次のとおりです。

db.collection.aggregate( <pipeline>, <options> )

db.collection.aggregate() は以下のパラメーターを取ります。

Parameter
タイプ
説明

pipeline

配列

データ集計の一連の操作またはステージ。 詳細については、集計パイプライン演算子を参照してください。

このメソッドでは、配列の要素としてではなく、個別の引数としてパイプライン ステージを受け入れ可能ですが、pipeline を配列として指定しない場合、options パラメーターを指定できません。

options

ドキュメント

任意.aggregate() が aggregate コマンドに渡す追加オプション。pipeline を配列として指定した場合にのみ使用できます。利用可能なオプションを確認するには、「AggregateOptions」を参照してください。

エラーが発生した場合、aggregate() ヘルパーは例外をスローします。

mongosh で、aggregate() カーソルが var キーワードを使用して変数に割り当てられていない場合、mongosh は最大 20 回までカーソルを自動的に反復します。でのカーソルの処理については、「 mongosh でのカーソルの反復mongosh 」を参照してください。

集計から返されるカーソルは、評価済みカーソル(最初のバッチが取得されたカーソル)で動作する次のようなカーソル メソッドのみをサポートします。

詳細については、以下を参照してください。

セッション内で作成されたカーソルの場合、セッション外で getMore を呼び出すことはできません。

同様に、セッション外で作成されたカーソルの場合、セッション内で getMore を呼び出すことはできません。

MongoDB ドライバーとmongosh では、確認されていない書込み操作を除くすべての操作がサーバー セッションに関連付けられます。セッションに明示的に関連付けられていない操作(つまり Mongo.startSession()を使用するもの)の場合、MongoDB ドライバーとmongoshによって暗黙的なセッションが作成され、それが操作に関連付けられます。

セッションが30分以上アイドル状態になると、MongoDBサーバーはそのセッションを期限切れとしてマークし、いつでも閉じる可能性があります。MongoDB サーバーでセッションが閉じると、そのセッションで進行中の操作や開いているカーソルもすべて終了します。これには、noCursorTimeout() や 30 分を超える maxTimeMS() で構成されたカーソルも含まれます。

カーソルを返す操作の場合、カーソルが 30 分以上アイドル状態になる可能性がある場合は、 Mongo.startSession() を使用して明示的なセッション内で操作を発行し、 refreshSessions コマンドを使用して定期的にセッションを更新します。詳細については、セッションアイドルタイムアウトを参照してください。

aggregate() は分散トランザクション内で使用できます。

ただし、トランザクション内では以下のステージは許可されません。

また、explain オプションも指定できません。

  • トランザクションの外部で作成されたカーソルの場合、トランザクション内で getMore を呼び出せません。

  • トランザクション内で作成されたカーソルの場合、トランザクション外で getMore を呼び出せません。

重要

ほとんどの場合、分散トランザクションでは 1 つのドキュメントの書き込み (write) よりもパフォーマンス コストが高くなります。分散トランザクションの可用性は、効果的なスキーマ設計の代わりにはなりません。多くのシナリオにおいて、非正規化されたデータモデル(埋め込みドキュメントと配列)が引き続きデータやユースケースに最適です。つまり、多くのシナリオにおいて、データを適切にモデリングすることで、分散トランザクションの必要性を最小限に抑えることができます。

トランザクションの使用に関するその他の考慮事項(ランタイム制限や oplog サイズ制限など)については、「本番環境での考慮事項」も参照してください。

$out または $merge ステージを含まない aggregate() 操作の場合。

aggregate() を発行したクライアントが操作が完了する前に切断された場合、 MongoDB はkillOp を使用して aggregate() を終了としてマークします。

バージョン8.0の新機能。

クエリ設定を使用して、インデックスヒント、操作拒否フィルター、その他のフィールドを設定できます。設定はクラスター全体のクエリシェイプに適用されます。クラスターは、シャットダウン後も設定を保持します。

クエリオプティマイザは、クエリプランニング中の追加入力としてクエリ設定を使用します。これは、クエリを実行するために選択されたプランに影響します。クエリ設定を使用してクエリシェイプをブロックすることもできます。

クエリ設定を追加して例を調べるには、setQuerySettings を参照してください。

find、distinct、aggregate コマンドのクエリ設定を追加できます。

クエリ設定にはより多くの機能があり、廃止されたインデックスフィルターよりも優先されます。

クエリ設定を削除するには、 removeQuerySettingsを使用します。 クエリ設定を取得するには、集計パイプラインの$querySettingsステージを使用します。

このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。

注意

moviesコレクション内のdocumentには、ここに表示されていない追加フィールドが含まれています。

{ title: 'The Shawshank Redemption', year: 1994, genres: [ 'Crime', 'Drama' ], runtime: 142, imdb: { rating: 9.3, votes: 1521105, id: 111161 }, directors: [ 'Frank Darabont' ], cast: [ 'Tim Robbins', 'Morgan Freeman', 'Bob Gunton', 'William Sadler' ],},{ title: 'The Godfather', year: 1972, genres: [ 'Crime', 'Drama' ], runtime: 175, imdb: { rating: 9.2, votes: 1038358, id: 68646 }, directors: [ 'Francis Ford Coppola' ], cast: [ 'Marlon Brando', 'Al Pacino', 'James Caan', 'Richard S. Castellano' ]},{ title: 'Pulp Fiction', year: 1994, genres: [ 'Crime', 'Drama' ], runtime: 154, imdb: { rating: 8.9, votes: 1179033, id: 110912 }, directors: [ 'Quentin Tarantino' ], cast: [ 'Tim Roth', 'Amanda Plummer', 'Laura Lovelace', 'John Travolta' ]},{ title: 'Forrest Gump', year: 1994, genres: [ 'Drama', 'Romance' ], runtime: 142, imdb: { rating: 8.8, votes: 1087227, id: 109830 }, directors: [ 'Robert Zemeckis' ], cast: [ 'Tom Hanks', 'Rebecca Williams', 'Sally Field', 'Michael Conner Humphreys' ],},{ title: 'Inception', year: 2010, genres: [ 'Action', 'Sci-Fi', 'Thriller' ], runtime: 148, imdb: { rating: 8.8, votes: 1294646, id: 1375666 }, directors: [ 'Christopher Nolan' ], cast: [ 'Leonardo DiCaprio', 'Joseph Gordon-Levitt', 'Ellen Page', 'Tom Hardy' ],}

次の集計操作を行います。

  • IMDB 評価が 8.5 を超える映画を選択します

  • 一致する映画を yearフィールドでグループ化します

  • imdb.ratingフィールドの平均から各 year の averageRating を計算します

  • averageRatingフィールドで結果を降順にソートします

db.movies.aggregate( [ { $match: { "imdb.rating": { $gt: 8.5 } } }, { $group: { _id: "$year", averageRating: { $avg: "$imdb.rating" } } }, { $sort: { averageRating: -1 } }, { $limit: 3 } ] )

この操作は、次のドキュメントを持つカーソルを返します。

[ { _id: 1972, averageRating: 9.2 }, { _id: 1990, averageRating: 9.166666666666666 }, { _id: 1974, averageRating: 9.1 }]

mongosh は返されたカーソルを自動的に反復して結果を出力します。でカーソルを手動で取り扱う方法については、「 mongosh でのカーソルの反復mongosh 」を参照してください。

次の例では、db.collection.explain() を使用して、集計パイプラインの実行プランに関する詳細情報を表示します。

db.movies.explain().aggregate( [ { $match: { "imdb.rating": { $gt: 8.5 } } }, { $group: { _id: "$year", averageRating: { $avg: "$imdb.rating" } } }, { $sort: { averageRating: -1 } } ] )

The operation returns a document that details the processing of the aggregation pipeline. For example, the document may show, among other details, which index, if any, the operation used. [1] If the movies collection is a sharded collection, the document also shows the division of labor between the shards and the merge operation, and for targeted queries, the targeted shards.

注意

explain 出力ドキュメントの対象読者は機械ではなく人間であり、出力形式はリリース間で変更される可能性があります。

executionStats または allPlansExecution 説明モードを db.collection.explain() メソッドに渡すと、より冗長な説明出力を表示できます。

[1] インデックス フィルターは使用インデックスの選択に影響する可能性があります。詳細については、「インデックス フィルター」を参照してください。

実行に 100 MB を超えるメモリを必要とするパイプライン ステージは、デフォルトで一時ファイルをディスクに書き込みます。これらの一時ファイルはパイプラインの実行中ずっと残り、インスタンスのストレージ容量に影響を与える可能性があります。

個々の find と aggregate コマンドは、次のいずれかの方法で allowDiskUseByDefault パラメーターを上書きできます。

  • allowDiskUseByDefaultが false に設定されている場合に { allowDiskUse: true } を使用して一時ファイルをディスクに書き込むことを許可する

  • allowDiskUseByDefault が true に設定されている場合に { allowDiskUse: false } を使用して一時ファイルがディスクに書き込むことを禁止する

プロファイラー ログ メッセージと診断ログ メッセージには、メモリ制限のために集計ステージで一時ファイルにデータが書込まれた場合、usedDisk インジケーターが含められます。

詳細については、「集計パイプラインの制限」を参照してください。

カーソルの初期バッチ サイズを指定するには、cursor オプションに次の構文を使用します。

cursor: { batchSize: <int> }

たとえば、次の集計操作では、カーソルの初期バッチサイズとして 0 を指定します。

db.theaters.aggregate( [ { $match: { "location.address.state": "NY" } }, { $group: { _id: "$location.address.city", theaterCount: { $sum: 1 } } }, { $sort: { theaterCount: -1 } }, { $limit: 2 } ], { cursor: { batchSize: 0 } })

初期バッチするのサイズを指定する { cursor: { batchSize: 0 } } ドキュメントは、1 個めのバッチするが空であることを示します。これにより、サーバー側での目立った作業なしに、カーソルまたはエラーメッセージをすばやく返すことができます。

後続の getMore 操作のバッチする サイズを指定するには、mongosh で batchSize() を使用するか、getMore コマンドで batchSize フィールドを使用します。

mongosh は返されたカーソルを自動的に反復して結果を出力します。でカーソルを手動で取り扱う方法については、「 mongosh でのカーソルの反復mongosh 」を参照してください。

照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。

次の集計操作では、sample_mflixデータベースの moviesコレクション内のすべてのフランス語映画のタイトルが返され、fr 照合を指定します。

db.movies.aggregate( [ { $match: {"countries": "France", "languages": "French"} }, { $project: { "title": 1, "_id": 0 } } ], { collation: { locale: "fr", strength: 1 } })

注意

複数のビューが関わる集計($lookup や $graphLookup など)が実行される場合、それらのビューには同じ照合が含まれる必要があります。

照合フィールドの説明については、照合ドキュメントを参照してください。

sample_mflixデータベースの moviesコレクションには、次と同様のdocumentが含まれています。

{ title: "The Shawshank Redemption", year: 1994, rated: "R", imdb: { rating: 9.3, votes: 1513145, id: 111161 }},{ title: "The Godfather", year: 1972, rated: "R", imdb: { rating: 9.2, votes: 1038358, id: 68646 }},{ title: "The Dark Knight", year: 2008, rated: "PG-13", imdb: { rating: 9, votes: 1495351, id: 468569 }},{ title: "Forrest Gump", year: 1994, rated: "PG-13", imdb: { rating: 8.8, votes: 1087227, id: 109830 }}

moviesコレクションに次のインデックスが存在するとします。

db.movies.createIndex( { "imdb.rating": 1, year: 1 } )
db.movies.createIndex( { "imdb.rating": 1, rated: 1 } )

下記の集計操作には、指定されたインデックスの使用を強制する hint オプションが含まれています。

db.movies.aggregate( [ { $sort: { "imdb.rating": 1 } }, { $match: { rated: "R", "imdb.rating": { $gte: 9.0 } } }, { $sort: { year: -1 } } ], { hint: { "imdb.rating": 1, rated: 1 } })

デフォルトの読み取り保証 (read concern) レベルを上書きするには、readConcern オプションを使用します。getMore コマンドは、元の aggregate コマンドで指定された readConcern レベルを使用します。

moviessample_mflixデータベースから コレクションに対する次の操作では、過半数のノードに書き込まれたことが確認されたデータの最新のコピーを読み取るために、 の 読み取り保証 (read concern) を指定します。"majority"

重要

  • $out ステージを含む集計に対して、読み取り保証レベル "majority" を指定できます。

  • 読み取り保証のレベルを問わず、ノード上の最新データにシステム内のデータの最新バージョンが反映されていない場合があります。

db.movies.aggregate( [ { $match: { "imdb.rating": { $gte: 8.0 } } }, { $group: { _id: "$rated", avgRating: { $avg: "$imdb.rating" }, count: { $sum: 1 } } }, { $sort: { avgRating: -1 } } ], { readConcern: { level: "majority" } })

単一のスレッドでそれ自体の書き込みの読み取りを可能にするには、レプリカセットのプライマリに対して "majority" 読み取り保証と "majority" 書込み保証を使用します。

sample_mflixサンプルデータセットの moviesコレクションには、次のdocumentと同様のdocumentが含まれています。

{ title: 'Forrest Gump', year: 1994, genres: [ 'Drama', 'Romance' ], runtime: 142, imdb: { rating: 8.8, votes: 1087227, id: 109830 }, directors: [ 'Robert Zemeckis' ], cast: [ 'Tom Hanks', 'Rebecca Williams', 'Sally Field', 'Michael Conner Humphreys' ],}

次の集計操作では、1994 で作成された映画が検索し、comment オプションを含めて、logs、db.system.profileコレクション、db.currentOp 内の追跡情報を提供します。

db.movies.aggregate( [ { $match: { year : 1994 } }, { $limit: 3 } ], { comment: "match_three_movies_from_1994" } )

プロファイリングが有効になっているシステムでは、以下で示すように、system.profile コレクションにクエリを実行して、すべての最新の類似した集計を確認できます。

db.system.profile.find( { "command.aggregate": "movies", "command.comment" : "match_three_movies_from_1994" } ).sort( { ts : -1 } ).pretty()

このクエリでは、プロファイラーの結果セットが次の形式で返されます。

{ "op" : "command", "ns" : "video.movies", "command" : { "aggregate" : "movies", "pipeline" : [ { "$match" : { "year" : 1994 } }, { "$limit": 3 } ], "comment" : "match_three_movies_from_1994", "cursor" : { }, "$db" : "video" }, ...}

アプリケーションは、システム内の特定の操作をより簡単に追跡または識別できるように、コメントに任意の情報をエンコードできます。たとえば、プロセス ID、スレッド ID、クライアントのホスト名、コマンドを発行したユーザーを含む文字列コメントを添付できます。

コマンド内の他の場所からアクセスできる変数を定義するには、 letオプションを使用します。

注意

パイプライン $match ステージで変数を使用して結果をフィルター処理するには $expr 演算子内で変数にアクセスする必要があります。

次の例:

  • 一致するdocumentは、imdb.ratingフィールドが 8.5 より大きい sample_mflix.moviesコレクションのdocumentで、結果は 3 つに限定されます

  • let で minRating 変数を定義します。これは $gt で $$minRating として参照されます。

db.movies.aggregate( [ { $match: { $expr: { $gt: [ "$imdb.rating", "$$minRating" ] } } }, { $limit: 3 } ], { let: { minRating: 8.5 } })
このページを評価