集計によるデータの変換
Overview
このガイドでは、 Kotlin Sync ドライバー を使用して集計操作を実行する方法を学習できます。
集計操作を使用して MongoDB コレクション内のデータを処理し、計算された結果を返すことができます。 クエリ API の一部である MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上の ステージを含むパイプラインに投入され、各ステージではドキュメントを変換して最終集計結果を出力します。
集計自動車操作は工場に似たものとして考えることができます。 自動車工場の組立ラインには、ドリルや溶接機のような、特定の作業をするための専用工具を備えた組立ステーションがあります。 未加工のパーツが工場に搬入され、組立ラインで完成品に加工、組み立てられます。
集計パイプラインは組み立てライン、集計ステージは組み立てステーション、演算子式は専用ツールです。
集計操作と検索操作の比較
検索操作を使用して、次のアクションを実行できます。
どのドキュメントを返すかを選ぶ
どのフィールドを返すかを選ぶ
結果を並べ替える
集計操作を使用して、次のアクションを実行できます。
検索操作の実行
フィールドの名前を変更する
フィールドを計算する
データを要約する
値をグループ化する
制限
集計操作を使用する場合、次の制限が適用されます。
返されたドキュメントは、 BSON ドキュメント サイズの制限である16メガバイトに違反していない必要があります。
パイプライン ステージには、デフォルトで100 MB のメモリ制限があります。 この制限を超えるには、
AggregateIterable
クラスのallowDiskUse()
メソッドを使用します。
集計の例
このセクションの例では、 Atlas サンプル データセットのsample_restaurants
データベースのrestaurants
コレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 Atlas を使い始める 」ガイドを参照してください。
次の 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 Server 」を参照してください。
集計パイプラインの組み立てと例については、 マニュアルの「 集計パイプライン MongoDB Server」を参照してください。
パイプライン ステージの作成の詳細については、 マニュアルの「 集計ステージMongoDB Server 」を参照してください。
MongoDB操作の説明の詳細については、 マニュアルの「 出力 と クエリプラン の説明MongoDB Server 」を参照してください。
API ドキュメント
Kotlin Sync ドライバーを使用して集計操作を実行する方法の詳細については、次の API ドキュメントを参照してください。