2015-10-13 95 views
2

我正在尋找一個沒有彈簧數據的解決方案。我的項目要求是沒有彈簧數據。mongo + spring data + aggragate sum

要使用mongo命令使用聚合函數來計算總和,才能獲得輸出。但通過使用彈簧數據獲取異常也是一樣。 樣品蒙戈查詢:

db.getCollection('events_collection').aggregate(
{ "$match" : { "store_no" : 3201 , "event_id" : 882800} }, 
{ "$group" : { "_id" : "$load_dt", "event_id": { "$first" : "$event_id" }, "start_dt" : { "$first" : "$start_dt" }, "count" : { "$sum" : 1 } } }, 
{ "$sort" : { "_id" : 1 } }, 
{ "$project" : { "load_dt" : "$_id", "ksn_cnt" : "$count", "event_id" : 1, "start_dt" : 1, "_id" : 0 } } 
) 

同樣的事情在Java作爲完成,

String json = "[ { \"$match\": { \"store_no\": 3201, \"event_id\": 882800 } }, { \"$group\": { \"_id\": \"$load_dt\", \"event_id\": { \"$first\": \"$event_id\" }, \"start_dt\": { \"$first\": \"$start_dt\" }, \"count\": { \"$sum\": 1 } } }, { \"$sort\": { \"_id\": 1 } }, { \"$project\": { \"load_dt\": \"$_id\", \"ksn_cnt\": \"$count\", \"event_id\": 1, \"start_dt\": 1, \"_id\": 0 } } ]"; 

BasicDBList pipeline = (BasicDBList) JSON.parse(json); 

System.out.println(pipeline); 

AggregationOutput output = col.aggregate(pipeline); 

的例外是:

com.mongodb.CommandFailureException: { "serverUsed" : "somrandomserver/10.10.10.10:27001" , "errmsg" : "exception: pipeline element 0 is not an object" , "code" : 15942 , "ok" : 0.0} 

可能有人請建議如何使用聚合函數春天?

回答

1

嘗試下面的(另)Spring Data MongoDB aggregation等效

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; 

MongoTemplate mongoTemplate = repository.getMongoTemplate(); 
Aggregation agg = newAggregation(
    match(Criteria.where("store_no").is(3201).and("event_id").is(882800)), 
    group("load_dt") 
     .first("event_id").as("event_id") 
     .first("start_dt").as("start_dt") 
     .count().as("ksn_cnt"), 
    sort(ASC, previousOperation()), 
    project("ksn_cnt", "event_id", "start_dt") 
     .and("load_dt").previousOperation()  
     .and(previousOperation()).exclude() 
); 

AggregationResults<OutputType> result = mongoTemplate.aggregate(agg, 
              "events_collection", OutputType.class); 
List<OutputType> mappedResult = result.getMappedResults(); 

作爲第一步驟,通過使用它接受標準查詢作爲參數的匹配操作過濾輸入集合。

在第二步中,將中間過濾文檔分組"load_dt"字段並計算文檔計數並將結果存儲在新字段"ksn_cnt"中。

按照previousOperation()方法給出的先前組操作的id-reference對中間結果進行排序。

最後在第四步中,從前面的組操作中選擇"ksn_cnt","event_id""start_dt"字段。請注意,"load_dt"也隱式引用了一個group-id字段。由於您不希望顯示隱式生成的ID,因此通過and(previousOperation()).exclude()排除之前操作中的ID。

請注意,如果您提供的輸入類作爲第一個參數newAggregation方法MongoTemplate將從這個類派生的輸入集合的名稱。否則,如果您不指定輸入類,則必須明確提供輸入集合的名稱。如果提供輸入類和輸入集合,則後者優先。

+0

我正在尋找沒有彈簧數據的解決方案。我的項目不允許使用彈簧數據。 –