我正在尝试确定进行 mongodb 对象版本控制的最佳方法。
基于mongodb 文档版本控制模式,建议将修订存储在历史集合中,并将当前版本存储在主集合中。据此,每个修订版都包含完整的对象,而不是存储差异。
然后我介绍了在 mongoDB中实现数据版本控制的方法,它推荐了一种方法来存储单个文档,其中包含其中的所有修订,并具有单独的历史集合。
因此,由于其复杂性,我正在尝试为以下文档模型实现我自己的对象版本控制实现。
发票.java
public class Invoice {
private long invoiceId;
private String userName;
private String userId;
private LocalDateTime createdDate;
private LocalDateTime lastModifiedDate;
private List<String> operationalUnits;
private List<BodyModel> body;
private List<ReviewModel> reviews;
private BigDecimal changedPrice;
private String submitterId;
private LocalDateTime submittedTime;
private String approverId;
private LocalDateTime approvedTime;
}
BodyModel.java
public class BodyModel {
private String packageId;
private List<ItemModel> items;
private List<String> reviews;
}
ReviewModel.java
public class ReviewModel {
private String publishedTime;
private String authorName;
private String authorId;
private String text;
}
项目模型.java
public class ItemModel {
private String itemNumber;
private String description;
private String brandId;
private String packId;
private List<String> reviews;
}
ER图(简化)
目前,我正在使用Javers library。但是,Javers 将 Invoice 模型作为主要实体,将 BodyModel、ReviewModel、ItemModel 等其他模型作为单独的 valueObjects。因此,它不是创建单个修订文档,而是为 valueObjects 创建单独的文档。此外,它总是从基础版本加上所有导致巨大读取时间的更改构造当前对象。此外,我还发现了valueObjects
javers 附带的一个问题。请参阅此问题以获取更多信息:MongoDB 文档版本更新问题与 JaVers
以下是问题,如果我要使用 Spring Boot 创建自己的实现,我会考虑。
- 如果我要在 mongoDB 时将revisionId放在每个修订中(如下面的对象所示)
save()
,我如何找到要包含的当前 revisionId ?
{
_Id: <ObjectId>,
invoiceId: <InvoiceId>,
invoice: <Invoice>,
revisionId: <revisionId>
}
为此,我可以在 InvoiceModel 中保留一个 revisionId 字段,可以在保存到主集合时进行更新。同时,它可用于将修订保存到历史收藏中。在这种情况下,这是最好的方法吗?
- 如果我只打算存储差异,那么如何获取对象的当前版本?
为此,必须从主集合中获取当前对象,然后将其与新版本进行比较(我已经有了新版本,因为这就是我要存储在主集合中的内容)以创建差异。然后 diff 可以存储在历史集合中,新版本可以存储在主集合中。这是存储差异的最佳方式吗?
在这两种情况下,来自 AOP 的切面都可以用来拦截save()
基础存储库的方法来完成任务。但是我主要不考虑编码实现细节,我想知道哪种方法或哪些方法可以有效地存储上面给出的数据模型的修订版(也想讨论我提到的方法)?