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

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

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

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

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

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

【问题讨论】:

    标签: java spring mongodb spring-data spring-data-mongodb


    【解决方案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 查找使用聚合来“左连接”引用的表,并使用进一步的投影来过滤掉不需要的东西。但是使用起来不是很方便
        猜你喜欢
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        相关资源
        最近更新 更多