首页 > 解决方案 > Spring Boot 和 Mongo DB:仅获取最新版本的 Document

问题描述

我有一个文档集合,其中每个唯一的 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;
}

标签: spring-data-mongodb

解决方案


对于这种操作,您需要使用MongoDB Aggregation Framework

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

Spring Data 通过MongoOperations. 请查看参考文档

一般来说,我认为@Aggregate在 Spring Data 中使用注释之类的东西是有益的。我已经打开DATAMONGO-2153来调查该选项。


推荐阅读