8

我开始MongoDB在我的应用程序中使用数据库,对于数据访问,我选择了 Spring Data for MongoDB。

我浏览了 API 参考和文档,可以看到有 map-reduce 集成,但是聚合框架呢?我可以看到它支持按操作分组,这表明它支持$group从这个判断的运算符:http: //docs.mongodb.org/manual/reference/sql-aggregation-comparison/,但是其他运算符呢?暂时不支持?

我问这个问题是因为我想知道与MongoDBSping Data 提供了什么样的集成,所以我知道会发生什么,可以这么说。

4

4 回答 4

8

Spring Data 1.3.0.RC1 可用,它支持聚合框架。

例如:shell 聚合命令:

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 DataMongoOperations.group()方法映射到db.collection.group()MongoDB 命令而不是$group聚合函数。目前 Spring Data MongoDB 中不支持聚合框架。正如您所提到的,Map reduce 是受支持的

于 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 回答