在Java Spring Boot Mongodb中返回聚合的嵌套文档

时间:2019-05-24 12:08:25

标签: java mongodb spring-boot

我正在研究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)来获得期望的结果,但是到目前为止我没有成功。 有人可以帮我吗?

谢谢。

0 个答案:

没有答案