我有一个文档集合,其中每个唯一的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;
}
答案 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来调查该选项。