【问题标题】:Not able to calculate average with MongoDB无法用 MongoDB 计算平均值
【发布时间】:2020-06-01 18:29:45
【问题描述】:

我想知道我无法计算 Spring 5 和 MongoDB 的平均值。

数据库中有 40 个具有这种格式的条目

结果(id=5e4adeca9eab5f052e2ac239,日期=2020-02-12, 值=1.048097596376957)

我有兴趣获取从 t1 到 t2 的日期以及所有匹配项的平均值。

我在 NPE 中编写的代码如下所示:

    MatchOperation filterDate = match(Criteria.where("date").gte(startWeek).lte(now));
    GroupOperation groupByValue = group("value").avg("value").as("averageValue");

    Aggregation aggregation = newAggregation(filterDate, groupByValue);
    AggregationResults<Document> result = mongoTemplate.aggregate(aggregation, "unknown", Document.class);

    Document document = result.getUniqueMappedResult();
    document.getDouble("averageValue");

当调用 getDouble 时,会发生 NPE。 matchCriteria 在我看来是正确的。 对于 GroupOperation,我有疑问。

2020-02-17 19:43:22.661 调试 10148 --- [nio-8080-exec-1] os.data.mongodb.core.MongoTemplate :执行聚合:[{ “$match”:{“date”:{“$gte”:{“$date”:1581289200000},“$lte”: {“$date”:1581894000000}}}},{“$group”:{“_id”:“$value”, "averageValues" : { "$avg" : "$value"}}}] 在未知集合中

import org.springframework.data.annotation.Id;


public class Result {

    @Id
    private String id;

    private LocalDate date;

    private Double value;

    public Result(LocalDate date, Double value) {
        this.date = date;
        this.value = value;
    }
}

我想知道分组。这有必要吗? 我需要收藏吗?

【问题讨论】:

    标签: mongodb spring-data mongotemplate


    【解决方案1】:

    要计算avg,需要$group类似的记录,并使用$avg运算符。

    在您的情况下,您想要计算 所有匹配项的平均值,但我猜您没有针对所有过滤匹配项具有相同值的字段。在这种情况下,您可以通过null 订购 MongoDB 组来计算平均值。

    将您的 Group 阶段更改为以下:

    GroupOperation groupByValue = group().avg("value").as("averageValue");
    

    将被翻译成:

    { "$group" : { "_id" : null, "averageValues" : { "$avg" : "$value"}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2013-01-14
      • 2012-06-19
      相关资源
      最近更新 更多