Java Spring数据Mongo审核字段反映在嵌套文档中

Java Spring数据Mongo审核字段反映在嵌套文档中,java,spring-data,spring-data-mongodb,audit,spring-repositories,Java,Spring Data,Spring Data Mongodb,Audit,Spring Repositories,当使用嵌套的已审核文档保存已审核(@CreatedDate、@LastModifiedDate)文档时,这两个日期也将反映在嵌套文档中 这是一个场景: DocumentA.java DocumentB.java 文档已存储在数据库中,并设置了createdDate和lastModifiedDate。然后,当使用嵌套文档保存新文档B时,嵌套文档的两个日期将被修改为刚为DocumentB设置的相同值。这只发生在嵌套文档中,而存储的文档不会被触摸(幸运的是!)预期的行为是,嵌套文档将保持与刚才通过代码

当使用嵌套的已审核文档保存已审核(@CreatedDate、@LastModifiedDate)文档时,这两个日期也将反映在嵌套文档中

这是一个场景:

DocumentA.java

DocumentB.java


文档已存储在数据库中,并设置了createdDate和lastModifiedDate。然后,当使用嵌套文档保存新文档B时,嵌套文档的两个日期将被修改为刚为DocumentB设置的相同值。这只发生在嵌套文档中,而存储的文档不会被触摸(幸运的是!)预期的行为是,嵌套文档将保持与刚才通过代码设置的完全相同(这意味着与原始文档相同)

这就像设计一样工作

嵌入文档A与引用文档A不同。嵌入文档作为主文档的一部分进行管理意味着跟踪所有更改,因为它们是文档B中的顶级字段。引用文档A是单独跟踪和管理的


如果您只是引用,则应该使用手动引用并使用单独调用加载,或者使用$lookup聚合查询加载。另一种选择是使用dbref让驱动程序在加载主文档时加载引用的文档。

无法使用引用,因为所需的行为是在保存文档B时具有文档的快照。DocumentB就像文档的历史轨迹,想象一下它就像文档的版本控制标签,它必须与我在B中设置的完全相同。我如何才能做到这一点?我认为不编写一些自定义代码是不可能的-Spring团队拒绝了这个请求-。您可以尝试这里提到的解决方法,看看是否有效。谢谢@svr的回答。最后,我编写了一个自定义事件侦听器,实现了onBeforeConvert,并仅在顶级文档中设置了审计字段,我们正在努力将审计也传播到嵌入式文档中,但提供了一个自定义注释,如NotAuditable,它禁用了对拥有它的嵌入式字段的审计。我认为这也可以满足要求。
public class DocumentA {
   @Id
   private String id;
   @Version
   private Long version;
   @CreatedDate
   private Long createdDate;
   @LastModifiedDate
   private Long lastModifiedDate;

   // getters and setters
}
public class DocumentB {
   @Id
   private String id;
   @Version
   private Long version;
   @CreatedDate
   private Long createdDate;
   @LastModifiedDate
   private Long lastModifiedDate;
   
   private DocumentA docA;

   // getters and setters
}