Spring data Mongo Audit 字段反映在嵌套文档中

Posted

技术标签:

【中文标题】Spring data Mongo Audit 字段反映在嵌套文档中【英文标题】:Spring data Mongo Audit fields reflected in nested documents 【发布时间】: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相同)

【问题讨论】:

【参考方案1】:

这就像设计一样工作。

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

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

【讨论】:

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

以上是关于Spring data Mongo Audit 字段反映在嵌套文档中的主要内容,如果未能解决你的问题,请参考以下文章

将 mongo 查询转换为 spring-data-mongo 查询

使用 spring data mongo 插入 Mongo 文档

如何使用 mongo 搜索集合并返回子文档列表(Spring-data-mongo)

使用 Spring data mongo 和 Spring data elasticsearch 时如何建模?

使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询

spring-data-mongo - 可选查询参数?