【问题标题】:How do I handle Many-To-One Relationships with Spring Boot + MongoDB如何使用 Spring Boot + MongoDB 处理多对一关系
【发布时间】:2021-01-25 13:30:01
【问题描述】:

我正在学习如何将 MongoDB 与 Spring Boot(Spring 数据 MondoDB)一起使用。

在我当前使用 PostgreSQL 的代码库中,我有一个 API GET /api/orders/238392,它返回一个模型如下:

{
    "orderId":238392,
    "status":"FULFILLED",
    "senNumber":"AB8893920",
    "customer":{
        "customerId":"lskj2409023471lskdjflsf",
        "name":"John Doe",
        "email":"john.doe@acme.com",
        "phoneNumber":"7326585306",
        "city":"Los Angeles"
    }
}

我现在想在后端使用 MongoDB 来实现这个用户案例。这是我的模型

// Orders.java
@Data
@Document
public class Order {
    @Id
    private Long orderId;
    private String status;
    private String senNumber;
    private Customer customer;
}


//Customer.java
@Data
@Document
public class Customer {
    @Id
    private String customerId;
    private String name;
    private String email;
    private String phoneNumber;
    private String city;
}

我的 API 现在可以正常工作了。但是,我对订单和客户之间的关系有疑问。 在关系世界中,我在customer 上有@ManyToOne,如下:

@ManyToOne
private Customer customer;

我无法在 Mongo 中执行此操作(我需要帮助)。

现在,我的问题。我有两个集合 - CustomerOrder。它们都有 CRUD API。如何处理 Order 和 Customer 之间的 ManyToOne 关系。

如果用户更新客户的某些属性(姓名、电子邮件等),该更改如何反映在订单文档中?

我想到了以下选项:

  1. 当我更新客户时,我可以使用新客户详细信息更新所有订单文档(这似乎不正确 - 我觉得可能会导致大量性能开销)
  2. 使用 @DbRef 之类的东西 - 如果是这种情况,我能否获得一些指向相关文档或参考资料的链接。
  3. 偶然发现了一个名为 RelMongo 的库,它允许您像在关系世界中一样使用 @ManyToOne 注释。

这可能是一个简单的最佳实践问题,我不确定。但是,任何帮助都会大大提高我的理解力!

谢谢, 斯里拉姆

【问题讨论】:

    标签: spring mongodb spring-boot


    【解决方案1】:

    您有以下关系:一个客户可以有多个订单。对于您提供的 API GET /api/orders/238392,您应该在您拥有的每个订单中引用 customer_id。

    如果您的路由具有以下属性:GET /api/customer/123/orders,它将返回客户的所有订单,那么您应该通过对 orderId 的引用数组来跟踪客户的订单。

    同样@ManyToOne and @OneToMany 等价于@DBRef

    这是一篇很好的博文,可帮助您为您的用例选择正确的架构设计: https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-3

    【讨论】:

    • 你真的为我打开了一扇门!谢谢!我浏览了这篇文章,并将我的模型更改为为客户使用 @DBRef,它非常适合我的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2020-10-09
    • 2018-09-17
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多