Spring Boot и Mongo DB: получите только последнюю версию Document - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть коллекция документов, в которой каждый уникальный templateId может иметь несколько версий:

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

    @Id
    private String id;

    private String templateId;
    private int version;
}

Есть ли простой способ получить только последние версии для каждого templateId с помощью простого метода интерфейса MongoRepository?

Вот мой текущий программный обходной путь, чтобы объяснить, что я пытаюсь сделать, и мой вспомогательный метод запроса для сортировки списка для моих нужд:

@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 голосов
/ 30 ноября 2018

Для операций такого типа вам необходимо использовать 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 , чтобы исследовать этот вариант.

...