spring - MongoDB中的多对一关系
问题描述
我是 MongoDB 和 NoSQL 数据库的新手,我正在尝试学习每个人在谈到 NoSQL 时都会提到的不同类型的思维。
我有一个典型的多对一关系情况。请不要告诉我 MongoDB 不是关系数据库,因为我已经知道了。关键是 - 现实以某种方式运作,我需要让我的应用程序反映它。现实世界充满了关系,如果您的答案是“为您的案例选择不同的数据库”,那么我认为 MongoDB 团队可以关闭他们的业务,因为在这种情况下他们的产品将完全没用。
所以让我们假设典型的员工/部门关系。Employee链接到单个Department。部门可以有零个或多个员工。
让我们假设超级简单的模型:
public class Department {
private String name;
// something like...
private List<Employee> employees;
}
public class Employee {
private String name;
// something like...
private Department department;
}
现在在我的 REST API 中,我需要一些非常基本的功能:
- 获取所有部门的列表
- 获取所有员工的列表,但它必须包含每个员工的部门名称
- 获取选定部门的员工列表
那么你将如何用 MongoDB 解决这个问题呢?我也在使用 Spring Boot 和 Spring Data,但我认为这并不重要。
我遇到了不同的方法,但对我来说似乎都很糟糕。将部门嵌入员工内部将无法获取所有部门或单个部门的员工的列表。将员工嵌入部门将无法获取所有员工的列表。使用@DbRef将模拟这种关系,但是如何在不为每个员工调用 REST API 的情况下获取包括部门名称在内的员工列表?
我最近阅读了很多教程、手册和 StackOverflow 讨论,但我还没有找到可以接受的答案。这么超简单的问题,MongoDB真的有可能解决不了吗?这甚至不是问题,而是我们周围世界的标准常见情况。
谢谢你
解决方案
也许您可以departmentId
在您的 Employee 文档中使用一个简单的(具有该部门的 Mongo ID 的值)?
这样您就可以避免嵌入文档,并且您的用例可以工作:
- 所有部门案例只是部门集合中的全部查找。
- 所有员工都是员工集合中的全部查找,然后在您的服务器中,您需要为员工中存在的所有不同部门 ID 调用部门集合。
- 选定部门案例的所有员工都是员工集合中的按部门 ID 查找。
这会以可接受的方式为您服务吗?
推荐阅读
- c# - 在 TPL 数据流中动态订阅/取消订阅
- c# - System.Text.Json - 反序列化可以是空字符串或类的对象
- python - 为什么我收到“ModuleNotFoundError:没有模块名称“pyperclip”?
- javascript - 使用 NodeJS req.user 的 Passport OpenIdConnect 身份验证未填充应用程序特定的用户详细信息
- c# - 为组合框设置数据源
- javascript - Passport.js 多重登录系统无法正常工作
- python - 使用 lxml 抓取网页时没有输出
- xml - 在生成的 PDF 中保留原始段落
- r - 闪亮的传单 - 设置 layerId 时未绘制点
- ios - 在辅助功能中获取外部键盘的完整键盘访问状态