我正在研究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;
....
....
每天都会有多个文档添加不同的MeasurementId和不同的值。 我想获取每一天(一个月,一年)中所有值的每个measurementId的总和。 到目前为止,我已经创建了一个结果文档类“ 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)来获得期望的结果,但是到目前为止我没有成功。 有人可以帮我吗?
谢谢。