【问题标题】:Spring data Mongo Audit fields reflected in nested documentsSpring data Mongo Audit 字段反映在嵌套文档中
【发布时间】:2021-02-04 03:12:33
【问题描述】:

当保存带有嵌套审计文档的审计(@CreatedDate、@LastModifiedDate)文档时,这两个日期也将反映在嵌套文档中。

这是场景:

DocumentA.java

public class DocumentA {
   @Id
   private String id;
   @Version
   private Long version;
   @CreatedDate
   private Long createdDate;
   @LastModifiedDate
   private Long lastModifiedDate;

   // getters and setters
}

DocumentB.java

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
}

DocumentA 已存储在具有 createdDate 和 lastModifiedDate 集的 db 中。然后,当保存带有嵌套 DocumentA 的新 DocumentB 时,嵌套 DocumentA 的 2 个日期将被修改为刚刚为 DocumentB 设置的相同值。这只发生在嵌套文档中,而存储的 DocumentA 没有被触及(幸运的是!)。 预期的行为是嵌套文档将保持与刚刚通过代码设置的完全相同(这意味着与原始文档A相同)

【问题讨论】:

    标签: java spring-data spring-data-mongodb audit spring-repositories


    【解决方案1】:

    这就像设计一样工作。

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

    如果您只是引用,您应该使用手动引用并使用单独调用或使用 $lookup 聚合查询加载。其他替代方法是使用 dbref 让驱动程序在加载主文档时加载引用的文档。

    【讨论】:

    • 无法使用引用,因为所需的行为是在保存文档 B 时拥有文档 A 的快照。 DocumentB 就像是 documentA 的历史轨迹,想象它像 documentA 的版本控制标签,它必须与我在 B 中设置的完全相同。我怎样才能做到这一点?
    • 我认为不编写一些自定义代码是不可能的——Spring 团队拒绝了这个请求——jira.spring.io/browse/DATACMNS-1776。您可以尝试那里提到的解决方法,看看它是否有效。
    • 感谢@svr 的回答。我最终编写了一个自定义事件侦听器,实现 onBeforeConvert 并仅在顶级文档中设置审计字段,我们正在努力将审计也传播到嵌入式文档,但提供一个自定义注释,如 NotAuditable,它禁用对拥有它的嵌入字段的审计.我认为这也可以满足请求的要求。
    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2013-11-24
    • 2020-09-08
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多