【发布时间】:2020-08-12 11:52:10
【问题描述】:
我有以下实体(getter、setter 和构造函数省略)
public class Event {
@Id
private String id;
private String internalUuid;
private EventType eventType;
}
EventType 是一个包含任意事件类型的枚举:
public enum EventType {
ACCEPTED,
PROCESSED,
DELIVERED;
}
我的问题是我有一个包含很多事件的表,其中一些具有相同的 internalUuid 但不同的状态。我需要获取一个事件列表,其中每个事件都代表“最新”状态(按 EventType 排序就足够了)。目前,我只是获取所有内容,在代码中分组以分隔列表,按 EventType 对列表进行排序,然后使用每个列表的第一个元素创建一个新列表。
示例如下。
表格中的数据:
{ "id": "1", "internalUuid": "1", "eventType": "ACCEPTED" },
{ "id": "2", "internalUuid": "1", "eventType": "PROCESSED" },
{ "id": "3", "internalUuid": "1", "eventType": "DELIVERED" },
{ "id": "4", "internalUuid": "2", "eventType": "ACCEPTED" },
{ "id": "5", "internalUuid": "2", "eventType": "PROCESSED" },
{ "id": "6", "internalUuid": "3", "eventType": "ACCEPTED" }
查询的输出(任何顺序都可以):
[
{ "id": "3", "internalUuid": "1", "eventType": "DELIVERED" },
{ "id": "5", "internalUuid": "2", "eventType": "PROCESSED" },
{ "id": "6", "internalUuid": "3", "eventType": "ACCEPTED" }
]
不保证“更高”的身份也有“更高”的 ID。
如果不手动完成整个过程,我该如何做到这一点?我真的不知道如何开始,因为我对 MongoDB 很陌生,但在 Google 上没有找到任何对我有帮助的东西。我正在使用 Spring Boot 和 Spring Data。
谢谢!
【问题讨论】:
-
您能发布您的 EventType 和示例数据以及预期输出吗
-
我不使用 Java,但您似乎需要聚合,首先使用任何
$match阶段,然后是$sort阶段以按 eventType 排序,然后是$group阶段使用internalUuid作为_id和$first或$last捕获$$ROOT
标签: spring mongodb spring-boot spring-data