如何管理MongoDB中的关系?

如何管理MongoDB中的关系?,mongodb,Mongodb,我是MongoDB的新手。我有一个主集合用户组。示例文档如下所示 {group_name:“xyz”,“previlege”:[“添加”,“删除”],…} 和第二个收集用户详细信息 {"user_name":"pt123","group_name":"xyz",...} 我如何维护这两个集合之间的关系。我是否应该使用用户组中的引用来查看用户详细信息或任何其他选择?简单回答:您没有。 当您开始关注MongoDB时,整个设计理念都发生了变化。如果我是你,我会在用户详细信息文档本身中维护previl

我是MongoDB的新手。我有一个主集合用户组。示例文档如下所示

{group_name:“xyz”,“previlege”:[“添加”,“删除”],…}

和第二个收集用户详细信息

{"user_name":"pt123","group_name":"xyz",...}

我如何维护这两个集合之间的关系。我是否应该使用用户组中的引用来查看用户详细信息或任何其他选择?

简单回答:您没有。
当您开始关注MongoDB时,整个设计理念都发生了变化。如果我是你,我会在用户详细信息文档本身中维护
previlege
字段

{"user_name":"abc","group_name":"xyz","previlege" : ["add","delete"]}

但是,如果您不断更改组权限,这可能并不理想。但其思想是,您可以设计数据存储,以便一个“记录”的所有信息都可以存储在一个对象中

简单的回答:你没有。
当您开始关注MongoDB时,整个设计理念都发生了变化。如果我是你,我会在用户详细信息文档本身中维护
previlege
字段

{"user_name":"abc","group_name":"xyz","previlege" : ["add","delete"]}
但是,如果您不断更改组权限,这可能并不理想。但其思想是,您可以设计数据存储,以便一个“记录”的所有信息都可以存储在一个对象中

通常,在MongoDB中,“has many”关系在关系数据库的另一端进行管理。MongoDB文档通常会有一个objectid或组名数组(或用于标识外部文档的任何名称)。这与关系数据库相反,关系数据库的另一端通常有一个“属于”列

请务必清楚,这不是必需的。在您的示例中,如果用户详细信息ID是您要进行的最常见的查询,则可以在组文档中存储一个用户详细信息ID数组。基本上,您应该问的问题是“我可能需要什么查询?”并设计文档来支持它。

通常,在MongoDB中,“has many”关系在关系数据库的另一端进行管理。MongoDB文档通常会有一个objectid或组名数组(或用于标识外部文档的任何名称)。这与关系数据库相反,关系数据库的另一端通常有一个“属于”列


请务必清楚,这不是必需的。在您的示例中,如果用户详细信息ID是您要进行的最常见的查询,则可以在组文档中存储一个用户详细信息ID数组。基本上,您应该问的问题是“我可能需要什么查询?”并设计文档来支持它。

MongoDB作为NoSQL没有显式连接。解决方法是可能的,但不推荐(请阅读MapReduce)

最好是在客户端从mongo集合中检索这两个文档,并应用特定于用户的权限。确保在用户组集合中的组名称上有索引


或者最好在客户端应用连接后,将用户的权限[读取、删除等]存储在同一文档中。但是,您不能从外部更新集合,因为这可能会破坏不变量。每次更新用户组时,您都需要自己在客户端应用这些权限(特权),并将这些权限保存在同一文档中。写操作可能会受到影响,但读取速度会很快(假设有几个字段被索引,比如用户名)。

作为NoSQL的MongoDB没有显式连接。解决方法是可能的,但不推荐(请阅读MapReduce)

最好是在客户端从mongo集合中检索这两个文档,并应用特定于用户的权限。确保在用户组集合中的组名称上有索引


或者最好在客户端应用连接后,将用户的权限[读取、删除等]存储在同一文档中。但是,您不能从外部更新集合,因为这可能会破坏不变量。每次更新用户组时,您都需要自己在客户端应用这些权限(特权),并将这些权限保存在同一文档中。写入可能会受到影响,但读取速度会很快(假设有几个字段被索引,比如用户名)。

您的后端堆栈是什么?JAVApython什么图书馆?我的后端堆栈是Java的,这里有很多好东西:什么是您的后端堆栈?JAVApython什么图书馆?等等。我的后端堆栈是Java的。这里有很多好东西:我同意你的观点,但我正在管理用户组,因此需要经常更新组previleges。我同意你的观点,但是我正在管理用户组,因此需要经常更新组previleges。使用MR进行连接是错误的…你应该在客户端进行连接这是我在第2段中说的。使用MR进行连接是错误的…你应该在客户端进行连接这是我在第2段中说的。