Overview
このガイドでは、 Kotlin Sync ドライバー を使用して集計操作を実行する方法を学習できます。
集計操作を使用して MongoDB コレクション内のデータを処理し、計算された結果を返すことができます。 クエリ API の一部である MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上の ステージを含むパイプラインに投入され、各ステージではドキュメントを変換して最終集計結果を出力します。
集計自動車操作は工場に似たものとして考えることができます。 自動車工場の組立ラインには、ドリルや溶接機のような、特定の作業をするための専用工具を備えた組立ステーションがあります。 未加工のパーツが工場に搬入され、組立ラインで完成品に加工、組み立てられます。
集計パイプラインは組み立てライン、集計ステージは組み立てステーション、演算子式は専用ツールです。
集計操作と検索操作の比較
検索操作を使用して、次のアクションを実行できます。
どのドキュメントを返すかを選ぶ
どのフィールドを返すかを選ぶ
結果を並べ替える
集計操作を使用して、次のアクションを実行できます。
検索操作の実行
フィールドの名前を変更する
フィールドを計算する
データを要約する
値をグループ化する
制限
集計操作を使用する場合、次の制限が適用されます。
返されたドキュメントは、 BSON ドキュメント サイズの制限である16メガバイトに違反していない必要があります。
パイプライン ステージには、デフォルトで100 MB のメモリ制限があります。 この制限を超えるには、
AggregateIterableクラスのallowDiskUse()メソッドを使用します。
集計の例
restaurantssample_restaurantsこのセクションの例では、Atlasサンプルデータセットの データベースの コレクションを使用します。 MongoDBデプロイを作成し、サンプルデータセットをロードする方法については、 「 MongoDB の使用開始 」ガイドを参照してください。
次の Kotlin データ クラスは、このコレクション内のドキュメントをモデル化します。
data class Restaurant( val name: String, val cuisine: String, val borough: String )
集計パイプラインの構築と実行
コレクション内のドキュメントに対して集計を実行するには、集計ステージのリストをaggregate()メソッドに渡します。
この例では、ニューヨーク市の各地区のケーキの数を出力します。 次のコードでは、次のステージを含む集計パイプラインが作成されます。
$matchステージで、
cuisineフィールドの値が"Bakery"であるドキュメントをフィルタリングします。一致するドキュメントを
boroughフィールドでグループ化し、そのフィールドの個別の値ごとにドキュメントの数を生成する$groupステージ。
val pipeline = listOf( Aggregates.match(Filters.eq(Restaurant::cuisine.name, "Bakery")), Aggregates.group("\$borough", Accumulators.sum("count", 1)) ) val results = collection.aggregate<Document>(pipeline) results.forEach { result -> println(result) }
Document{{_id=Bronx, count=71}} Document{{_id=Manhattan, count=221}} Document{{_id=Brooklyn, count=173}} Document{{_id=Queens, count=204}} Document{{_id=Staten Island, count=20}} Document{{_id=Missing, count=2}}
Tip
$group集計ステージのグループキーを指定する場合は、 \文字を使用してすべての$文字をエスケープするようにします。
集計の説明
MongoDB が操作を実行する方法に関する情報を表示するには、パイプラインに$explain集計ステージを含めることができます。 MongoDB が操作を説明すると、実行プランとパフォーマンス統計が返されます。 実行プランは、MongoDB が操作を完了できる潜在的な方法です。 MongoDB に操作を説明するように指示すると、その操作のために MongoDB が選択したプランと拒否された実行プランの両方が返されます。
次のコード例では、前のセクションと同じ集計を実行し、操作の詳細を出力するために$explainステージを追加します。
print(collection.aggregate(pipeline).explain())
{ "explainVersion": "2", "queryPlanner": { "namespace": "sample_restaurants.restaurants" "indexFilterSet": false, "parsedQuery": { "cuisine": {"$eq": "Bakery"} }, "queryHash": "865F14C3", "planCacheKey": "0697561B", "optimizedPipeline": true, "maxIndexedOrSolutionsReached": false, "maxIndexedAndSolutionsReached": false, "maxScansToExplodeReached": false, "winningPlan": { ... } ... } ... }
MongoDB Search
次のいずれかのパイプラインステージを含む集計パイプラインを作成して実行中ことで、 MongoDB Search クエリを実行できます。
$search$searchMeta
MongoDB Searchパイプラインステージの詳細については、Atlas ドキュメントの「 集計パイプライン ステージの選択 」を参照してください。 Kotlin Syncドライバーを使用してMongoDB Searchパイプライン検索ステージを作成する例については、「 MongoDB Search クエリの実行 」ガイドをご覧ください。
詳細情報
集計ステージの完全なリストについては、 MongoDB Serverマニュアルの「 集計ステージ 」を参照してください。
集計パイプラインの組み立てと例については、 マニュアルの「 集計パイプライン MongoDB Server」を参照してください。
MongoDB操作の説明の詳細については、 マニュアルの「 出力 と クエリプラン の説明MongoDB Server 」を参照してください。
API ドキュメント
Kotlin Sync ドライバーを使用して集計操作を実行する方法の詳細については、次の API ドキュメントを参照してください。