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

30
这个问题的标题相当自相矛盾,因为我正在尝试在非关系型数据库中实现关系... :) 但我的意思是如何在使用MongoDB的应用程序模型类中定义实体之间的关联。
在使用JPA时,我经常使用@ManyToMany或@OneToMany注释来定义对象之间的关系。Spring Data MongoDB中是否有类似的内容?
研究MongoDB后,我发现有两种可能的关联方法:引用和嵌入式数据。
Spring Data使用哪一个?是否可以配置关联模式?
3个回答

19
您可以使用@DBRef注释来将引用的类持久化到单独的集合中,否则文档将被持久化到同一文档(json)中。使用DBRef需要额外的查询mongodb驱动程序,您应该考虑这个问题以分析性能问题。
来自spring data documentation @DBRef-应用于字段,表示要使用com.mongodb.DBRef进行存储。
7.3.4使用DBRefs 映射框架不必在文档中嵌入子对象。 您还可以将它们单独存储,并使用DBRef引用该文档。 当从MongoDB加载对象时,这些引用将被急切地解析,您将获得一个映射对象,它看起来与嵌入在主文档中存储的对象相同。

2
小心使用@DBRef。您将无法对引用的文档使用投影。例如,docA = {id:1, anotherDoc:DBRef(id:2)}docB = {id:2, foo:bar}。现在,当查询docA时,您可以使用投影,但不适用于docB。我的意思是,您不能像这样进行投影{anotherDoc.foo:0}。它将始终获取整个docB - Benjamin M
@BenjaminM 自从Mongo 3.4.4版本以来,您实际上可以使用聚合将引用表通过ObjectID查找进行“左连接”,并使用进一步的投影来过滤掉不需要的内容。然而,这种方法并不是很方便。 - Roman Vottner

2

您可以使用RelMongo框架,该框架提供@OneToMany和@OneToOne注释支持,从而实现关系。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接