バックアップ集計パイプライン
チャートのレンダリングに必要なデータを取得するために、Charts は MongoDB Aggregation Pipeline を作成し、MongoDB database サーバー上でパイプラインを実行します。 パイプラインは複数のステージで構成されており、各ステージはチャートの作成者によって指定された異なる 設定 に基づいて生成されます。
このドキュメントでは、さまざまなチャートビルダの設定が集計パイプラインの構築にどのように使用されるかについて説明しています。 チャートの作成に使用されるパイプラインは、右上の省略記号ドロップダウンで View Aggregation Pipelineオプションを選択することで表示できます。
Atlas Charts では、次の順序で下記のセグメントで構成されるパイプラインが構築されます。
注意
チャートを作成するときは、前のチャート セグメントのすべてではなく、一部を構成できます。 Charts が集計パイプラインを生成するとき、指定されていないセグメントはスキップします。
例
次のチャートは、事務用品会社の合計売上額を購入方法別に分類したものです。 データコレクション内の各ドキュメントは 1 つの販売を表します。
このチャートを例として、上記の各設定の仕様によって、Atlas Charts によって生成される集計パイプラインがどのように変更されるかを調べます。
エンコーディング
Data Sourceパイプライン、 Queryバー クエリ、計算フィールド、フィルターがFilterペインに追加されていない場合、Atlas Charts は次の集計パイプラインを生成します。
1 { 2 "$addFields": { // Encoding 3 "__alias_0": { 4 "$sum": "$items.price" 5 } 6 } 7 }, 8 { 9 "$group": { 10 "_id": { 11 "__alias_1": "$purchaseMethod" 12 }, 13 "__alias_0": { 14 "$sum": "$__alias_0" 15 } 16 } 17 }, 18 { 19 "$project": { 20 "_id": 0, 21 "__alias_1": "$_id.__alias_1", 22 "__alias_0": 1 23 } 24 }, 25 { 26 "$project": { 27 "x": "$__alias_1", 28 "y": "$__alias_0", 29 "_id": 0 30 } 31 }, 32 33 { 34 "$addFields": { // Sorting 35 "__agg_sum": { 36 "$sum": [ 37 "$y" 38 ] 39 } 40 } 41 }, 42 { 43 "$sort": { 44 "__agg_sum": -1 45 } 46 }, 47 { 48 "$project": { 49 "__agg_sum": 0 50 } 51 }, 52 { 53 "$limit": 5000 54 }
この時点でのパイプラインは、 Encodeパネル、デフォルトのソート順序のステージ、および Atlas Charts によって 5000 に設定されている最大ドキュメント数で構成されています。
クエリの追加
以下のクエリでは、表示されるドキュメントを、 saleDate
がJanuary 1, 2017
以降と等しく、 items
配列に 5 つ以上の要素があるドキュメントのみに制限します。 items
は、各要素が販売中に購入された商品である配列です。
クエリ:
{ $and: [ { saleDate: { $gte: new Date("2017-01-01") } }, { 'items.4': { $exists: true } } ] }
上記のクエリをQueryバーで適用すると、次のチャートと集計パイプラインが生成されます。
集計パイプライン:
1 { 2 "$match": { // Query 3 "$and": [ 4 { 5 "saleDate": { 6 "$gte": { 7 "$date": "2017-01-01T00:00:00Z" 8 } 9 } 10 }, 11 { 12 "items.4": { 13 "$exists": true 14 } 15 } 16 ] 17 } 18 }, 19 { 20 "$addFields": { 21 "__alias_0": { 22 "$sum": "$items.price" 23 } 24 } 25 }, 26 { 27 "$group": { 28 "_id": { 29 "__alias_1": "$purchaseMethod" 30 }, 31 "__alias_0": { 32 "$sum": "$__alias_0" 33 } 34 } 35 }, 36 { 37 "$project": { 38 "_id": 0, 39 "__alias_1": "$_id.__alias_1", 40 "__alias_0": 1 41 } 42 }, 43 { 44 "$project": { 45 "x": "$__alias_1", 46 "y": "$__alias_0", 47 "_id": 0 48 } 49 }, 50 { 51 "$addFields": { 52 "__agg_sum": { 53 "$sum": [ 54 "$y" 55 ] 56 } 57 } 58 }, 59 { 60 "$sort": { 61 "__agg_sum": -1 62 } 63 }, 64 { 65 "$project": { 66 "__agg_sum": 0 67 } 68 }, 69 { 70 "$limit": 5000 71 }
集計パイプラインは、クエリが適用された状態で開始され、 Encodeパネルで選択されたグループと最大ドキュメント制限が続くようになりました。
計算フィールドの追加
また、 チャートを変更して、生成された総売上額を購入方法別に分類することもできます。 このタスクを実行するために、価格と数量を掛けて合計売上額を計算する計算フィールドを作成します。 上記のクエリに加えて、この新しい計算フィールドを追加すると、次のチャートとパイプラインが生成されます。
計算フィールド式:
集計パイプライン:
1 { 2 "$match": { 3 "$and": [ 4 { 5 "saleDate": { 6 "$gte": { 7 "$date": "2017-01-01T00:00:00Z" 8 } 9 } 10 }, 11 { 12 "items.4": { 13 "$exists": true 14 } 15 } 16 ] 17 } 18 }, 19 { 20 "$addFields": { // Calculated Field 21 "revenue": { 22 "$reduce": { 23 "input": "$items", 24 "initialValue": 0, 25 "in": { 26 "$sum": [ 27 "$$value", 28 { 29 "$multiply": [ 30 "$$this.price", 31 "$$this.quantity" 32 ] 33 } 34 ] 35 } 36 } 37 } 38 } 39 }, 40 { 41 "$group": { 42 "_id": { 43 "__alias_0": "$purchaseMethod" 44 }, 45 "__alias_1": { 46 "$sum": "$revenue" 47 } 48 } 49 }, 50 { 51 "$project": { 52 "_id": 0, 53 "__alias_0": "$_id.__alias_0", 54 "__alias_1": 1 55 } 56 }, 57 { 58 "$project": { 59 "x": "$__alias_0", 60 "y": "$__alias_1", 61 "_id": 0 62 } 63 }, 64 { 65 "$addFields": { 66 "__agg_sum": { 67 "$sum": [ 68 "$y" 69 ] 70 } 71 } 72 }, 73 { 74 "$sort": { 75 "__agg_sum": -1 76 } 77 }, 78 { 79 "$project": { 80 "__agg_sum": 0 81 } 82 }, 83 { 84 "$limit": 5000 85 }
更新されたパイプラインには、 Queryバーに適用されるクエリの直下に 計算フィールドが含まれるようになりましたが、コンポーネントの残りの順序は変更されません。
フィルターの追加
このチャートをさらに絞り込むには、 Filterペインにフィルターを追加して、ニューヨークのロケーションで行われた店舗内販売のみを選択します。 このフィルターを追加すると、次のチャートと集計パイプラインが生成されます。
集計パイプライン:
1 { 2 "$match": { 3 "$and": [ 4 { 5 "saleDate": { 6 "$gte": { 7 "$date": "2017-01-01T00:00:00Z" 8 } 9 } 10 }, 11 { 12 "items.4": { 13 "$exists": true 14 } 15 } 16 ] 17 } 18 }, 19 { 20 "$addFields": { 21 "revenue": { 22 "$reduce": { 23 "input": "$items", 24 "initialValue": 0, 25 "in": { 26 "$sum": [ 27 "$$value", 28 { 29 "$multiply": [ 30 "$$this.price", 31 "$$this.quantity" 32 ] 33 } 34 ] 35 } 36 } 37 } 38 } 39 }, 40 { 41 "$match": { // Filter 42 "storeLocation": { 43 "$in": [ 44 "New York" 45 ] 46 } 47 } 48 }, 49 { 50 "$group": { 51 "_id": { 52 "__alias_0": "$purchaseMethod" 53 }, 54 "__alias_1": { 55 "$sum": "$revenue" 56 } 57 } 58 }, 59 { 60 "$project": { 61 "_id": 0, 62 "__alias_0": "$_id.__alias_0", 63 "__alias_1": 1 64 } 65 }, 66 { 67 "$project": { 68 "x": "$__alias_0", 69 "y": "$__alias_1", 70 "_id": 0 71 } 72 }, 73 { 74 "$addFields": { 75 "__agg_sum": { 76 "$sum": [ 77 "$y" 78 ] 79 } 80 } 81 }, 82 { 83 "$sort": { 84 "__agg_sum": -1 85 } 86 }, 87 { 88 "$project": { 89 "__agg_sum": 0 90 } 91 }, 92 { 93 "$limit": 5000 94 }
パイプラインには、計算フィールドの直下にstoreLocation
フィルターが含まれるようになりましたが、コンポーネントの残りの順序は変更されません。