Невозможно рассчитать среднее с MongoDB - PullRequest
0 голосов
/ 17 февраля 2020

Интересно, что я не могу вычислить среднее значение для Spring 5 и MongoDB.

В базе 40 записей с этим форматом

Результат (id = 5e4adeca9eab5f052e2ac239, date = 2020-02-12, value = 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. Критерии соответствия на мой взгляд верны. У GroupOperation у меня есть сомнения.

2020-02-17 19: 43: 22.661 DEBUG 10148 --- [nio-8080-exe c -1] osdata.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;
    }
}

Интересно о группировке. Это необходимо? И нужна ли мне коллекция?

1 Ответ

0 голосов
/ 18 февраля 2020

Для вычисления avg необходимо $group аналогичные записи и использовать оператор $avg.

В вашем случае вы хотите вычислить среднее для всех совпадений , но, думаю, у вас нет поля с одинаковым значением для всех отфильтрованных совпадений. В этом случае вы можете заказать группу MongoDB на null для расчета среднего значения.

Измените свой Group этап на следующий:

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

, который будет переведен в:

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