2013-03-25 16 views
8

Zacząłem korzystać z bazy danych MongoDB w mojej aplikacji i dla dostępu do danych Wybrałem dane sprężyn dla MongoDB.Wiosenne dane mongodb - integracja szkieletu agregacji

Przeszukałem dokumentację i dokumentację interfejsu API i widzę, że istnieje integracja polegająca na zmniejszeniu liczby map, ale co z ramą agregacji? Widzę, że obsługuje on grupę po operacji, co oznacza, że ​​obsługuje operatora $group, sądząc po tym: http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/, ale co z innymi operatorami, które nie są obecnie obsługiwane?

Zadaję to pytanie, ponieważ chciałem się dowiedzieć, jaki rodzaj integracji z MongoDB zapewnia usługa Sping Data, więc wiem, czego się można spodziewać.

Odpowiedz

5

Metoda Spring Data MongoOperations.group() jest mapowana na komendę MongoDB na db.collection.group(), a nie na funkcję agregacji $group. Obecnie nie ma wsparcia w Spring Data MongoDB dla struktury agregacji. Zmniejszenie mapy, jak już wspomniano, jest obsługiwane przez

+0

Dzięki za wyjaśnienie tego dla mnie. – Andna

+6

Możesz jednak zrobić jeden krok w dół do sterownika Java mongodb, gdy potrzebujesz mocy agregacji. 'mongoOps.getCollection (" yourCollection ") agregacja (...)' –

+0

Dzięki za te informacje może się przydać. – Andna

8

Spring Data 1.3.0.RC1 jest dostępna i obsługuje strukturę agregacji.

Na przykład: COMAND agregacja powłoka:

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

prowadzony jest tak ze 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); 

Dokumentacja jest here

UWAGA: Ostatnio mieliśmy aby przełączyć przy użyciu wersji BUILD-SNAPSHOT wersji 1.3.0. Ta zmiana wymagała zmiany 2 z powyższych linii, które zmieniły się na:

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

co z "próbką" lub losowym wyborem? https://docs.mongodb.org/master/reference/operator/aggregation/sample/ – dit

0

Oto jak uzyskać sumę określonego pola.

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")  
    ); 
Powiązane problemy