返回集合中的最后一个嵌入数据

时间:2018-04-03 15:33:47

标签: mongodb spring-data-mongodb spring-mongodb

在spring-boot数据mongodb应用程序中,我想返回嵌入集合的最后一个元素。

我的文件是:

@Document
public class ConnectedObject {
  @Id
  private String uuid;
  private List<Measure> measures = new ArrayList<>();
}

public class Measure {
  private LocalDateTime timestamp;
  private long stepsCount;
}

mongoDb中的数据实例:

{
 "_id":"aaaa",
 "measures":[
   {"timestamp":"2018-04-05T08:20:33.561Z","stepsCount":"0"},
   {"timestamp":"2018-04-05T08:21:35.561Z","stepsCount":"10"},
   {"timestamp":"2018-04-05T08:20:35.561Z","stepsCount":"0"}
  ]
 }

我想获得connectedObject的最后一个度量(按时间戳字段过滤)(在uuid上过滤)。 我不知道如何使用MongoTemplate编写查询。

我已在项目中拥有自定义存储库。

2 个答案:

答案 0 :(得分:0)

类似下面的查询应该提供您需要的内容

db.collection.aggregate([
 {$match: {'$uuid':'12345'}},
 {$sort:{'$measure.timestamp':1}},
 {$project:{
     uuid: 1,
     last: { $arrayElemAt: [ "$measures", -1 ] }
  }
 }
])

答案 1 :(得分:0)

经过大量尝试后,正在运行的是:

public Measure getLastMeasureOf(String uuid) {
    final Aggregation agg = newAggregation(
            match(Criteria.where("uuid").is(uuid)),
            unwind("measures"),
            sort(Sort.Direction.DESC, "measures.timestamp"),
            group("uuid").first("$$ROOT").as("result"),
            project("result.uuid").and("result.measures").as("last")
    );

    final AggregationResults<ObjectWithLastMeasure> results
            = template.aggregate(agg, ConnectedObject.class, ObjectWithLastMeasure.class);

    final ObjectWithLastMeasure owlm = results.getUniqueMappedResult();
    return owlm == null ? null : owlm.getLast();
}