如何在MongoDB中管理关系?

时间:2013-07-10 12:31:23

标签: mongodb

我是MongoDB的新用户。我有一个Master Collection user_group。示例文档如下所示。

{group_name:"xyz","previlege":["Add","Delete"],...}

第二次收集user_detail

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

如何维护这两个集合之间的关系。我应该使用user_group中的引用到user_detail或任何其他集合吗?

3 个答案:

答案 0 :(得分:3)

通常,在MongoDB中,与关系数据库相反,管理“有很多”关系。 MongoDB文档通常会有一个ObjectIds或组名称数组(或者您用来标识外部文档的任何内容)。这与关系数据库相反,其中另一方通常具有“属于”列。

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

答案 1 :(得分:1)

简单回答:你没有。
当您开始查看MongoDB时,整个设计理念会发生变化。如果我是你,我会在user_detail文档中保留previlege字段。

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

如果您不断更改群组权限,这可能并不理想。但我们的想法是,您以某种方式设计数据存储,以便将一个“记录”的所有信息存储在一个对象中。

答案 2 :(得分:0)

作为NoSQL的MongoDB没有显式连接。可以使用变通方法,但不推荐(阅读MapReduce)。

最好的办法是从客户端的mongo集合中检索这两个文档,并应用用户特定的权限。确保您在user_group集合中的group_name上有索引。

或者更好的是,在客户端应用联接后,仍然可以在同一文档中存储用户的权限[read,del等]。但是,您无法在外部更新集合,因为这可能会破坏不变量。每次发生用户组更新时,您都需要在客户端自行应用这些权限(权限),并将这些权限保存在同一文档中。写入可能会受到影响,但读取速度会很快(假设有一些字段已编入索引,如用户名)。