Spring Boot和Mongo DB:仅获取文档的最新版本

时间:2018-11-29 10:07:00

标签: spring-data-mongodb

我有一个文档集合,其中每个唯一的templateId可以具有多个版本:

@Document(collection = "templates")
public class TemplateEntity {

    @Id
    private String id;

    private String templateId;
    private int version;
}

是否有一种简单的方法,可以使用简单的MongoRepository接口方法仅获取每个templateId的最新版本?

这是我当前的程序化变通方法,用于解释我要尝试做的事情以及我的助手查询方法来对列表进行排序以符合我的需求:

@GetMapping("/list")
public List<TemplateEntity> listTemplates() {
    List<TemplateEntity> filtered = new ArrayList<>();
    List<TemplateEntity> allTemplates = repository.findAllByOrderByTemplateIdAscVersionDesc();
    String templateId = "";
    for (TemplateEntity tpl : allTemplates) {
        if (!tpl.getTemplateId().equals(templateId)) {
            filtered.add(tpl);
            templateId = tpl.getTemplateId();
        }
    }
    return filtered;
}

1 个答案:

答案 0 :(得分:1)

对于这种操作,您需要使用https://stackblitz.com/edit/angular-q46mwh

db.getCollection("templates").aggregate([
    { "$group": { "_id": "$templateId", "tmpId": { "$first": "$_id" }, "maxVersion": { "$max": "$version"} } },
    { "$project": {"_id": "$tmpId", "templateId": "$_id", "version": "$maxVersion"} }
])

Spring Data通过MongoOperations为聚合提供支持。请查看MongoDB Aggregation Framework

总的来说,我认为在Spring Data中使用类似@Aggregate的注释将是有益的。我已经打开Reference Documentation来调查该选项。