以下代码没有给出预期的结果,我已经尝试过多个文档,这些文档的结构如下。
_id: 5a7714d44c75220958e6aa01
imei:355227045347655
point: [3.143453333333333,80.10954]
heading: 0
speed:0
timestamp: 2018-02-04 19:42:36.000
point_distance: 525.25
现在我需要计算给定 imei
和时间段的每个记录匹配的 point_distance
总和。我尝试使用以下代码来实现此目的,但即使存在所需的数据也不会返回任何内容。
public Object findDistance(long imei, Date from, Date to) {
List aggregationOps = new ArrayList<>();
//operations
aggregationOps.add(match(Criteria.where("imei").is(imei)));
aggregationOps.add(match(Criteria.where("timestamp").gte(from)));
aggregationOps.add(match(Criteria.where("timestamp").lte(to)));
aggregationOps.add(group("imei").sum("point_distance").as("distance"));
aggregationOps.add(project("imei").and("distance").previousOperation());
AggregationOptions agOps = new AggregationOptions.Builder().allowDiskUse(true).cursor(new BasicDBObject()).build();
return (DistanceInfo) getMongoTemplate()
.aggregate(newAggregation(aggregationOps).withOptions(agOps), Location.class, DistanceInfo.class)
.getUniqueMappedResult();
}
日期
> from
和 to
格式为 yyyy-MM-dd hh:mm:ss
DistanceInfo
类
public class DistanceInfo {
long imei;
double distance;
}
我是 mongodb 的新手,不知道我做错了什么,我该如何纠正这个问题?非常感谢任何帮助。
最佳答案
试试这个。这应该有效
MatchOperation matchOperation = match(Criteria.where("imei").is(imei)
.and("timestamp").gte(from.getTime()).lte(to.getTime()));
GroupOperation groupOperation = group("imei").sum("point_distance").as("distance");
ProjectionOperation projectionOperation = project().andExpression("imei").as("imei")
.andExpression("distance").as("distance");
Aggregation aggregation = newAggregation(matchOperation, groupOperation, projectionOperation);
AggregationResults<DistanceInfo> results = mongoTemplate.aggregate(aggregation, "location", DistanceInfo.class);
return results.getMappedResults();
关于java - spring data mongodb - 日期聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48610377/