spring-data-mongodb - 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;
}
解决方案
对于这种操作,您需要使用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来调查该选项。
推荐阅读
- php - proj4php坐标转换
- html - 无法调用嵌套在 ngOnInit 中的函数
- call - 如何使用 webhook 和 CALL STATUS CHANGES 将呼叫数据发送到带有 .mp3 文件记录的 Google 电子表格
- xcode - 为什么我不断收到 rsync 错误:“Command PhaseScriptExecution failed with nonzero exit code”
- python - 向熊猫数据框添加行,其中列包含应该是另一行的附加值?
- visual-studio-code - 是否可以将 package.json 文件中 vscode 片段的路径更改为 url 链接
- c# - 由于这一行代码,控制台中的颜色混乱了
- python - 为什么discord.py中会出现这个错误?
- kotlin - 是否可以在 Kotlin 中使用 vararg 实现序列编程?
- powershell - Invoke-RestMethod 等效于 curl 的 --connect-to?