2013-03-25 148 views
8

我開始在我的應用程序和數據訪問中使用MongoDB數據庫我選擇了Spring Data for MongoDB。Spring數據mongodb - 聚合框架集成

我刪除了API參考和文檔,我可以看到有map-reduce集成,但聚合框架呢?我可以看到它支持group by操作,這將表明它支持$group運營商從這個角度來看:http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/,但其他運營商呢,現在還不支持?

我問這個問題,因爲我想知道什麼樣的與MongoDB自旋微觀數據集成提供了,所以我知道會發生什麼,可以這麼說。

回答

5

將Spring Data MongoOperations.group()方法映射到db.collection.group() MongoDB命令,而不是$group聚合函數。目前在Spring Data MongoDB中不支持聚合框架。正如你所提到的,地圖縮小功能支持

+0

感謝澄清這對我來說。 – Andna 2013-03-26 07:04:37

+6

但是,只要您需要聚合框架的強大功能,就可以向mongodb Java驅動程序邁出一步。 'mongoOps.getCollection(「yourCollection」)。aggregate(...)' – 2013-03-28 14:54:50

+0

感謝這些信息,它可能派上用場。 – Andna 2013-03-28 19:00:00

8

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

例如: 外殼聚集COMAND:

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

的文檔here

注意:我們最近不得不改用使用版本1.3.0的BUILD-SNAPSHOT構建。此更改需要更改以上兩行中的更改爲:

AggregationOperation group = Aggregation.group("card_acceptor").sum("amount").as("amount_sum").count().as("tran_count"); 
Aggregation aggregation = Aggregation.newAggregation(match, group); 
+0

'樣本'或隨機選擇? https://docs.mongodb.org/master/reference/operator/aggregation/sample/ – dit 2016-03-13 22:55:50

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; 

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