Spring Data MongoDB - 聚合框架集成

8

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

我查看了API参考和文档,发现它支持map-reduce集成,但聚合框架呢?我可以看到它支持按组操作,这表明它支持$group运算符,根据此网址判断:http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/。但是其他运算符呢?现在是否也支持?

我提出这个问题是因为我想知道MongoDB Sping Data提供了什么样的集成,这样我就知道可以期待些什么。

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);

关于sample或随机选择怎么样?https://docs.mongodb.org/master/reference/operator/aggregation/sample/ - dieter

5

Spring Data的MongoOperations.group()方法映射到db.collection.group() MongoDB命令,而非$group聚合函数。目前,Spring Data MongoDB不支持聚合框架。但是,正如您所提到的,Map reduce是受支持的。


6
如果需要聚合框架的功能,可以使用mongodb Java驱动程序来降低一步。 mongoOps.getCollection("yourCollection").aggregate( ... ) - a.b

1
 Aggregation aggregation = newAggregation(
        match(Criteria.where("salesyear").is(year)),
        group("brand","salesyear").sum("numberOfCars").as("total"),
        sort(Sort.Direction.ASC, previousOperation(), "brand")    
      );

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;

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接