Я работаю над проектом 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), чтобы получить желаемый результат, но пока у меня ничего не получалось.
Может ли кто-нибудь помочь мне, возможно?
Заранее спасибо.