【问题标题】:spring data mongodb - aggregation with datesspring data mongodb - 日期聚合
【发布时间】:2018-02-04 16:28:50
【问题描述】:

以下代码没有给出预期的结果,我尝试了多个文档,这些文档的结构如下。

_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();
}

Date > fromto 被格式化为yyyy-MM-dd hh:mm:ss

DistanceInfo

public class DistanceInfo {
    long imei;
    double distance;
}

我是这个 mongodb 的新手,不知道我做错了什么,我该如何纠正?非常感谢任何帮助。

【问题讨论】:

  • 不应该是lte(to)吗?
  • 已更正,但结果仍然相同

标签: java spring mongodb spring-data aggregate


【解决方案1】:

试试这个。这应该工作

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

【讨论】:

  • 返回错误Command failed with error 9: 'The 'cursor' option is required, except for aggregate with the explain argument'
  • 我正在使用mongodb-java-driver 3.6.1spring-data-mongodb 1.10.9
  • 在我的机器上它可以工作。我正在使用 mongodb-driver 3.4.3 和 spring-data-mongodb 1.10.8.RELEASE。 stackoverflow.com/questions/47472688/…
  • 尝试在您的原始代码中删除.cursor(new BasicDBObject())此代码
  • 所以,我必须将spring-data 版本升级到1.10.10.RELEASE 并使用此解决方案,它有效,但删除.cursor(new BasicDBObject()) 无效,谢谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 2019-11-27
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多