Spring Data MongoDB:如何实现“实体关系”?

Posted

技术标签:

【中文标题】Spring Data MongoDB:如何实现“实体关系”?【英文标题】:Spring Data MongoDB: how to implement "entity relationships"? 【发布时间】:2015-05-31 23:19:39 【问题描述】:

这个问题的标题很矛盾,因为我试图在非关系数据库中实现关系... :)

但我的意思是如何在使用 MongoDB 的应用程序模型类中定义实体之间的关联

使用 JPA 我经常使用@ManyToMany@OneToMany 注释来定义对象之间的关系。 Spring Data MongoDB中是否有类似的东西?

研究 MongoDB 我意识到有两种可能的关联方法:ReferencesEmbedded Data

Spring Data 使用的是哪一个?是否可以配置关联模式?

【问题讨论】:

【参考方案1】:

如果你的关系不是基于dbref,你可以使用@DocumentReference https://spring.io/blog/2021/11/29/spring-data-mongodb-relation-modelling

【讨论】:

【参考方案2】:

您可以使用RelMongo 框架,它允许通过提供@OneToMany 和@OneToOne 注释支持来实现关系。

【讨论】:

【参考方案3】:

您可以使用@DBRef 注解将引用的类保存在单独的集合中,否则文档将保存在同一个文档(json)中。 使用 DBRef 需要额外查询 mongodb 驱动,分析性能问题时应考虑这一点。

来自spring data documentation

@DBRef - 应用于该字段以指示它将使用 com.mongodb.DBRef 进行存储。

7.3.4 使用 DBRefs 映射框架不必存储嵌入在文档中的子对象。您还可以单独存储它们并使用 DBRef 来引用该文档。当从 MongoDB 加载对象时,这些引用将被急切地解析,您将返回一个映射对象,该映射对象看起来与存储在您的主文档中一样。

【讨论】:

小心@DBRef。您将无法对引用的文档使用投影。 IE。 docA = id:1, anotherDoc:DBRef(id:2)docB = id:2, foo:bar。现在查询docA时可以使用投影,但我不会申请docB。我的意思是,你不能做这样的事情anotherDoc.foo:0。它总是会获取整个docB @BenjaminM 从 Mongo 3.4.4 开始,您实际上 can 通过 ObjectID 查找使用聚合来“左连接”引用的表,并使用进一步的投影来过滤掉不需要的东西。但是使用起来不是很方便

以上是关于Spring Data MongoDB:如何实现“实体关系”?的主要内容,如果未能解决你的问题,请参考以下文章

如何利用spring data mongodb 进行多条件查询

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

求教Spring Data Mongodb 的自增ID实现

Spring Data MongoDB 三:基本文档查询(QueryBasicQuery)

如何配置两个实例mongodb使用spring boot和spring data

MongoDB Aggregation - 如何使用 spring-data-mongodb 将查询表达式应用到匹配阶段?