我正在学习如何使用MongoDB与spring启动(spring data MondoDB)。
在我目前使用PostgreSQL的代码库中,我有一个APIGET /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;
我不能在蒙古语中这样做(这是我需要帮助的地方)。
现在,回答我的问题。我有两个集合Customer顺序和。它们都有CRUD api。如何处理订单和客户之间的多对一关系。如果用户更新了Customer的某些属性(姓名、电子邮件等),该更改如何反映在Orders文档中?
我想到了以下选项:
- 当我更新客户时,我可以用新的客户详细信息更新所有的订单文档(这似乎不正确-可能会导致很多性能开销,我觉得)
- 使用
@DbRef
之类的东西-如果是这样的话,我可以得到一些相关文档或参考资料的链接吗? - 遇到一个名为
RelMongo
的库,它允许您使用@ManyToOne
注释,就像您在关系世界中一样。
这可能是一个简单的最佳实践问题,我不确定。然而,任何帮助都有助于提高我的理解!!
谢谢,斯
您有以下关系:一个客户可以有多个订单。对于您提供的APIGET /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