mongodb - MongoDB - 我的用户文档是否应该包含项目 ID 列表?
问题描述
我有users
和的集合projects
。每个项目都与一个用户完全相关。
我的问题是:每个用户都应该持有项目 ID 列表吗?
如果我想检索特定用户的所有项目,哪个选项更有效和最佳实践:
- 在用户 id 属性上创建项目集合的索引。不仅仅是查询用户 ID 属性。
- 在项目 id 属性上创建项目集合的索引。比,如果用户持有其项目 ID,只需查询项目集合以获取这些特定 ID。
选择哪个选项?也许还有第三种更好的选择?第一个选项的优点是我在删除/添加项目时不需要更新用户文档中的项目列表。
谢谢!
解决方案
每个项目都与一个用户完全相关。
一个user
可以有很多projects
(并且一个项目只与一个用户相关联)。这是一对多的关系。
我的问题是:每个用户都应该持有项目 ID 列表吗?
每个人都user
应该存储他/她的列表projects
。例如:
user:
id: <some value>,
name: <some value>,
email: <some value>,
projects: [
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
{ projectId: <some value>, projectName: <...>, projectDescription: <....>, otherInfo: { fld1: <...>, fld2: <...>, etc. } },
...
]
请注意,每个都是数组project
中的子文档(对象或嵌入文档) 。projects
Aproject
有其相关的详细信息,如 、projectId
、projectName
等。
如果我想检索特定用户的所有项目,哪个选项更有效和最佳实践:
一个。在用户 id 属性上创建项目集合的索引。不仅仅是查询用户 ID 属性。
湾。在项目 id 属性上创建项目集合的索引。比,如果用户持有其项目 ID,只需查询项目集合以获取这些特定 ID。
我认为,应该只有一个名为 as 的集合user_projects
。假设:(i)auser
可能有 0 到 100 个项目,并且(ii)aproject
的细节不是太大。
这是将 1 对 N 关系的“多”方嵌入“单”方的模型。这是一种推荐的方法,对数据进行反规范化。这具有高效和快速查询的优点。这简化了事务,因为写入(插入、更新和删除)将是原子的,只需对同一集合中的文档进行单一操作。
关于检索特定用户的所有项目:
您将使用user
id
or name
(带有唯一索引)来检索文档,这将是非常快速的查询。您可以在projects
数组上拥有索引(数组字段上的索引称为Multikey Indexes) - 在项目的字段上。例如,索引projectId
或/和projectName
是有意义的。
您可以获取用户的所有项目 - 它是使用user
id
/的简单查询name
。查询投影允许project
显示相关的信息。您可以使用find
oraggregate
方法来构建查询。您可以使用or查询特定project
的 a 。由于和字段上有索引,这将是一个有效的查询。user
projectId
projectName
user
project
所以,我的建议是有一个集合,user_projects
,其中包含 auser
的信息和projects
嵌入的信息。
推荐阅读
- switch-statement - 使用变量的 Javascript 案例语句
- typescript - 如何区分 TypeScript 中结构相同的类型?
- rust - 如何在数据保存在 Rust 的“RefCell”中的对象上定义索引特征?
- javascript - 我找不到在 React 中暂停倒数计时器的方法(清除间隔似乎不起作用)
- c++ - std::enable_if 更改成员 *variable* 声明/类型
- c - 如何在 IP(v4/v6) 地址(和端口)和字符串之间进行转换?
- c - 我打印矩阵的功能是返回随机数
- javascript - 如何获取具有多个键的对象数组中所有键的值,然后将它们全部相加
- java - 如何防止JavaFX调用方法事件?JavaFX
- c - 如何在 .dll 文件中打印到控制台