8

私は自分のアプリケーションでデータベースを使い始めMongoDB、データアクセスのためにMongoDBにSpringDataを選択しました。

APIリファレンスとドキュメントをざっと読んだところ、map-reduce統合があることがわかりましたが、集約フレームワークについてはどうでしょうか。これは、group by操作をサポートしていることがわかります。これは、 http: //docs.mongodb.org/manual/reference/sql-aggregation-comparison/$groupから判断すると、演算子をサポートしていることを示していますが、他の演算子についてはどうでしょうか。今のところサポートされていませんか?

この質問をしているのは、MongoDBSping Dataとの統合がどのようなものであるかを知りたかったので、いわば何を期待できるかを知っているからです。

4

4 に答える 4

8

Spring Data 1.3.0.RC1が利用可能であり、集約フレームワークをサポートしています。

例:シェル集約コマンド:

db.eft_transactions.aggregate(
    {$match:
        {
            service:"EFT",
            source:"MARKUP",
        }
    },
    {$group:
        {
            _id:"$card_acceptor_id",
            tran_count:{$sum:1},
            amount_sum:{$sum:"$amount"}
        }
    }
)

javaから次のように実行されます:

    AggregationOperation match = Aggregation.match(Criteria.where("service").is("EFT").and("source").is("MARKUP"));
    AggregationOperation group = Aggregation.group("card_acceptor").and("amount_sum").sum("amount").and("tran_count").count();
    Aggregation aggregation = newAggregation(match, group);
    AggregationResults<StoreSummary> result = this.mongoTemplate.aggregate(aggregation, "eft_transactions", StoreSummary.class);

ドキュメントはこちら

注:最近、バージョン1.3.0のBUILD-SNAPSHOTビルドの使用に切り替える必要がありました。この変更により、上記の2行を次のように変更する必要がありました。

AggregationOperation group = Aggregation.group("card_acceptor").sum("amount").as("amount_sum").count().as("tran_count");
Aggregation aggregation = Aggregation.newAggregation(match, group);
于 2013-08-08T12:05:47.990 に答える
5

Spring Dataメソッドは、集計関数ではなく、MongoDBコマンドにMongoOperations.group()マップされます。現在、SpringDataMongoDBでは集約フレームワークはサポートされていません。あなたが言ったように、Mapreduceはサポートされていますがdb.collection.group()$group

于 2013-03-25T21:48:09.540 に答える
1
 Aggregation aggregation = newAggregation(
        match(Criteria.where("salesyear").is(year)),
        group("brand","salesyear").sum("numberOfCars").as("total"),
        sort(Sort.Direction.ASC, previousOperation(), "brand")    
      );
于 2015-05-12T15:27:36.733 に答える
0

特定のフィールドの合計を取得する方法は次のとおりです。

private Map<String, Long> getTotalMap(){
        /*
            db.pDSSummaryModel.aggregate([{
                $group: {
                    _id: null,
                    total: {
                        $sum: '$totalUniqueCustomerCount'
                    }
                }
            }])
         */
        Aggregation aggregations = newAggregation(
                group("null").sum("totalUniqueUserCount").as("userTotal")
                        .sum("totalUniqueCustomerCount").as("customerTotal"),
                project("customerTotal", "userTotal")
        );

        AggregationResults<DBObject> results = mongoTemplate.aggregate(aggregations, "pDSSummaryModel", DBObject.class);
        List<DBObject> fieldList = results.getMappedResults();
        Map<String, Long> map = new HashMap<>();
        if(fieldList != null && !fieldList.isEmpty()) {
            for(DBObject db: fieldList){
                map.put("userTotal", parseLong(db.get("userTotal").toString()));
                map.put("customerTotal", parseLong(db.get("customerTotal").toString()));
            }
        }
        return map;

    }
于 2014-06-26T06:58:00.367 に答える