1

訪問計算值,我有旅行的集合,每行有一個的startDateTime和completionDateTime財產。春數據MongoDB的聚合框架,例外

我試圖使用聚合框架來找到用戶的出行的平均持續時間。

我的聚集看起來非常簡單,但和它拋出一個異常。

有以下3個步驟,第一隻匹配前往特定的用戶ID。 在管道的第二步中,我會將我感興趣的數據以及每次旅程的新計算持續時間進行投影。

我預計從投影的持續時間是在人羣一步,但是我得到以下IllegalArgumentException異常。 持續時間不是我的Trip類中的屬性,而是來自我在文檔中看到的例子,我不認爲它需要。 持續時間是我的分析類的一個屬性。

TypedAggregation<Trip> aggregation = newAggregation(Trip.class, 
    match(Criteria.where("userId").is(aUserId)), 

    project("completionDateTime", "startDateTime", "userId") 
    .and("completionDateTime").minus("startDateTime").as("duration"), 

    group("userId").avg("duration").as("averageDuration") 
); 
AggregationResults<Analytics> result = mongoTemplate.aggregate(aggregation, Analytics.class); 

我相信,持續時間越來越計算正確,如果我離開了組一步我回來的文檔的集合,它們都具有持續時間設置。

java.lang.IllegalArgumentException: Invalid reference 'duration'! 
    at org.springframework.data.mongodb.core.aggregation.ExposedFieldsAggregationOperationContext.getReference(ExposedFieldsAggregationOperationContext.java:78) 
    at org.springframework.data.mongodb.core.aggregation.GroupOperation$Operation.getValue(GroupOperation.java:367) 
    at org.springframework.data.mongodb.core.aggregation.GroupOperation$Operation.toDBObject(GroupOperation.java:363) 
    at org.springframework.data.mongodb.core.aggregation.GroupOperation.toDBObject(GroupOperation.java:308) 
    at org.springframework.data.mongodb.core.aggregation.Aggregation.toDbObject(Aggregation.java:247) 

我使用1.3.4.RELEASE

有什麼建議?

+0

你能準確地用更新的問題,你怎麼跑了企圖對1.4以及是否得到了確切的相同的異常(如你不能包括你得到的那個嗎?) –

+0

@AsyaKamsky我使用完全相同的代碼,並得到了與1.4.1.RELEASE – DannyLane

回答

3

升級到1.4.1後,我能夠使用以獲得期望的結果:

.andExpression("completionDateTime - startDateTime").as("duration") 
+0

您可以編輯您的問題或添加爲一個評論,它不應該,除非它是一個答案這裏下去... –

+0

這就是答案,這需要24個小時能夠接受我自己的答案。 – DannyLane

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 –

1

看起來你正在運行到https://jira.spring.io/browse/DATAMONGO-838,直到它的固定,您可能需要找出一種不同的方式做你的需要。

在蒙戈外殼採用JS,你不需要有$project場,你可以替代在計算表達成團,直接像這樣:

db.collection.aggregate({$match:{ your-match } }, 
    { $group : { 
     _id : "$userId", 
     avgDuration : { $avg : {$subtract:["$completionDateTime","startDateTime"]}}, 
    } }); 

可能可以返回表達式在春天這樣做。如果沒有,您的另一種選擇是通過Java驅動程序將聚合直接傳遞給MongoDB,繞過Spring,直到bug修復。

+0

完全相同的例外很好的建議。其實這個錯誤修正已經在一個已發佈的版本中可用。你介意更新你的答案嗎?我不想再添加另一個基本重複你所說的話的答案。 –

+0

我很早就接受了這個答案。我剛剛更新到1.4.1.RELEASE版本,仍然得到相同的錯誤。修復版本是否有所不同?或者也許這是一個不同的問題? – DannyLane

+0

當然,我會根據更新後的錯誤信息進行編輯 - 但是我確實看到它被標記爲1.4GA固定,所以它不是固定的,在所有情況下都不是固定的,或者不是完全相同的錯誤但是表現出相同方式的不同。 –