2013-03-25 21 views
8

Uygulamamda MongoDB veritabanını kullanmaya başladım ve veri erişimi için MongoDB için Spring Data'yı seçtim.Spring data mongodb - aggregation framework entegrasyonu

API referansı ve dokümantasyonunu gözden geçirdim ve harita azaltma entegrasyonu olduğunu görebiliyorum, ancak toplama yapısı nedir? Grup tarafından çalışmayı desteklediğini görebiliyorum. Bu, http://docs.mongodb.org/manual/reference/sql-aggregation-comparison/ numaralı telefonu değerlendiren $group operatörünü desteklediğini, ancak diğer operatörler için şu anda desteklenmeyenleri desteklediğini gösterir.

Bu soruyu soruyorum çünkü MongoDB Sping Data ile ne tür bir entegrasyon sağladığını bilmek istedim, böylece konuşmak için ne beklediğimi biliyorum.

cevap

5

Yay Verisi MongoOperations.group() yöntemi db.collection.group() MongoDB komutuyla eşleştirilir ve $group toplama işleviyle eşleştirilmez. Şu anda, birleştirme çerçevesi için Spring Data MongoDB'de destek yoktur. Harita küçültme, bahsettiğiniz gibi,

+0

teşekkürler. – Andna

+6

Ancak, agregasyon çerçevesinin güçlerine ihtiyaç duyduğunuzda mongodb Java sürücüsüne bir adım daha yaklaşabilirsiniz. 'mongoOps.getCollection (" yourCollection "). Aggregate (...)' –

+0

Bu bilgi için teşekkürler, kullanışlı olabilir. – Andna

8

Spring Data 1.3.0.RC1 kullanılabilir durumdadır ve toplama çerçevesini desteklemektedir. Örneğin

: kabuk toplama COMAND:

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

java bunun gibi çalıştırılır:

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

dokümantasyon here

çıkarıldı NOT: Son zamanlarda geçmek zorunda kaldı 1.3.0 versiyonunun BUILD-SNAPSHOT yapısını kullanarak.

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

'sample' veya random select hakkında ne dersiniz? https://docs.mongodb.org/master/reference/operator/aggregation/sample/ – dit

0
İşte

belirli bir alanın toplamını almak için yapılması gerekenler: Bu değişiklik değişti yukarıdaki satırları 2'ye değişikliği gerektirmiştir. Benim için bu açıkladığınız için

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")  
    ); 
İlgili konular