Возврат агрегированного вложенного документа в Java Spring при загрузке Mongodb - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над проектом Java Spring Mongodb, и у меня есть класс (документ mongodb) 'Measurement'.

@Document
public class Measurement {
    @Id
    private String id;

    //@DBRef
    @JsonIgnore
    private Device device;

    @Indexed
    private Integer measurementId;

    private Double value;

    @CreatedDate
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createdDate;

    ....
    ....

Каждый день будет добавляться несколько документов с разными идентификаторами измерений и разными значениями. Я хотел бы получить сумму за измерениеId всех значений для каждого дня (через месяц, год). До сих пор я создал класс результирующего документа 'MeasurementSummary'

public class MeasurementSummary
{
    private Integer measurementId;
    private Double sumValue;
    private String day;

    ....
    ....

Я также создал интерфейс репозитория и класс реализации, и я могу получить следующие результаты (пример)

{
   "measurementId" : 4,
   "sumValue" : 7.0,
   "day" : "24"
}
{
   "measurementId" : 3,
   "sumValue" : 2.0,
   "day" : "24"
}
{
   "measurementId" : 2,
   "sumValue" : 19.0,
   "day" : "24"
 }

но я бы хотел что-то вроде этого:

{
   "_id" : { "day" : 24, ..... },
   "measurements" : [
      { "measurementId" : "2", "sumValue" : 19.0 },
      { "measurementId" : "3", "sumValue" : 2.0 },
      { "measurementId" : "4", "sumValue" : 7.0 }
   ]
}

Вот как происходит агрегация:

@Override
public List<MeasurementSummary> findCalculatedMonthData(int monthnr, int year) {
    List<Integer> measurements_list = Arrays.stream(DeviceProperties.getMeasurements()).collect(Collectors.toList());

    Aggregation aggregation = newAggregation(
            project("measurementId", "value").andExpression("dayOfMonth(createdDate)").as("day").andExpression("month(createdDate)").as("month").andExpression("year(createdDate)").as("year"),
            match(Criteria.where("measurementId").in(measurements_list).and("month").is(monthnr).and("year").is(year)),
            group("measurementId", "day").sum("value").as("sumValue"),
            sort(Sort.Direction.ASC, "day")

    );

    return mongoTemplate.aggregate(aggregation, Measurement.class, MeasurementSummary.class).getMappedResults();
}

Я много чего пробовал (пытался использовать push и nested), чтобы получить желаемый результат, но пока у меня ничего не получалось. Может ли кто-нибудь помочь мне, возможно?

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...