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

return the last embeded data in a collection

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

我的文档是:

@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"}
  ]
 }

我想获取连接对象的最后一个测量值(按时间戳字段过滤)(按 uuid 过滤)。 我不知道如何使用 MongoTemplate 编写查询。

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

类似于下面的查询应该可以满足您的需求

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

经过多次尝试,第一个运行是:

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();
}