【发布时间】:2014-05-11 02:32:52
【问题描述】:
我有一个行程集合,每个行程都有一个 startDateTime 和一个 completionDateTime 属性。
我正在尝试使用聚合框架来查找用户旅行的平均持续时间。
我的聚合看起来很简单,但它会引发异常。
下面有 3 个步骤,第一个只是匹配到特定 userId 的行程。 在管道的第二步中,我将我感兴趣的数据与新计算的每次旅行的持续时间一起投影。
我预计投影的持续时间在组步骤中可用,但我得到下面的 IllegalArgumentException。 Duration 不是我的 Trip 类的属性,但从我在文档中看到的示例来看,我认为不需要。 Duration 是我的分析类的一个属性。
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
有什么建议吗?
【问题讨论】:
-
您能否准确地更新您的问题,说明您是如何针对 1.4 进行尝试的,以及您是否遇到了完全相同的异常(如果没有,您能否包括您确实得到的异常?)
-
@AsyaKamsky 我使用了完全相同的代码并得到了与 1.4.1.RELEASE 完全相同的异常
标签: spring mongodb spring-data aggregation-framework spring-data-mongodb