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 时如何建模?