9. オブジェクトの集計

通常のクエリに加え、MongoDBのAggregationを使用することができます。 グルーピング、データの加算など、複雑な検索条件を指定することができます。

本ガイドでは、SDKからのAPI呼び出しの方法について説明します。

注釈

使用にあたって、演算子の制限や注意事項があります。 事前に 集計(Aggregation) を参照して下さい。

9.1. 集計条件の指定

集計に使用するデータは、商品の売り上げ情報を含むObjectがsalesバケットに保存済みとします。

説明のため、一部フィールドは省略しています。

// salesバケットのデータ
{
    {"date":"2018-01-01", "shop":"Tokyo", "item":"A", "number":1, "price":100 ... },
    {"date":"2018-01-02", "shop":"Osaka", "item":"B", "number":1, "price":75  ... },
    {"date":"2018-01-02", "shop":"Osaka", "item":"C", "number":1, "price":250 ... },
    {"date":"2018-01-03", "shop":"Tokyo", "item":"A", "number":2, "price":200 ... },
    {"date":"2018-01-04", "shop":"Tokyo", "item":"B", "number":2, "price":150 ... }
}

検索の条件は、JSON配列に指定します。 以下の例では、"Tokyo"で販売された商品毎に、売り上げの合計を集計します。

通常NbJSONObject、NbJSONArray等を使用して条件を組み立てますが、 一覧性のため、以下の例では文字列で記載しています。

String pipelineBase = "{ \"pipeline\":                  " +
           "[                                           " +
           "   { \"$match\": { \"shop\": \"Tokyo\" }},  " +
           "   { \"$group\": {                          " +
           "       \"_id\": \"$item\",                  " +
           "       \"total\": { \"$sum\": \"$price\" }  " +
           "     }                                      " +
           "   }                                        " +
           "]}                                          ";

NbJSONArray pipeline = NbJSONParser.parse(pipelineBase).getJSONArray("pipeline");

一致条件を表す"$match"で、販売した"shopが"Tokyo"であるオブジェクトに絞り込みを行います。

その後、"$group"では、商品"item"毎に、売上"price"の和を"total"としてグルーピングします。 _idに指定したフィールドは、グループ識別用のキーとして扱われます。

9.2. 集計の実行

Aggregationを使用するためには、NbObjectBucket.aggregate()を呼び出します。 引数にはpipelineを指定します。

NbObjectBucket bucket = NbService.getInstance().objectBucketManager().getBucket("sales");
bucket.aggregate(pipeline, null, new NbCallback<NbJSONArray> {
    @Override
    public void onSuccess(NbJSONArray result) {
        // 成功時の処理
    }

    @Override
    public void onFailure(int statuCode) {
        // 失敗時の処理
    }
});

結果はNbJSONArrayで返却されます。 "item A" 2件、"item B" 1件の売り上げが集計されます。

集計データのイメージは以下の通りです。

[
    {"_id": "A", "total": 300},
    {"_id": "B", "total": 150}
]

注釈

MongoDBのAggregationは多様な集計機能をサポートしています。 詳細は以下を参照下さい。

警告

オフラインバケットに対してはAggregationを使用することができません。