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 我意识到有两种可能的关联方法:References 和 Embedded 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 三:基本文档查询(QueryBasicQuery)
如何配置两个实例mongodb使用spring boot和spring data
MongoDB Aggregation - 如何使用 spring-data-mongodb 将查询表达式应用到匹配阶段?