具有角色的参考数组的猫鼬模式

Posted

技术标签:

【中文标题】具有角色的参考数组的猫鼬模式【英文标题】:Mongoose schema for arrays of refs with role 【发布时间】:2014-11-14 16:00:58 【问题描述】:

我对 NoSQL 的做事方式非常陌生,所以如果我只是在想这个完全错误的想法,请原谅(我觉得我是这样)。

我的应用程序具有用户和组织,用户必须拥有并属于具有成员或所有者角色的组织。

目前在我的用户架构中:

orgs: [ type: Schema.Types.ObjectId, ref: 'Org' ]

在我的组织架构中,我有:

成员:[ type: Schema.Types.ObjectId, ref: 'User' ]

但我也想为此附加成员或所有者的角色。

这是我应该以某种方式放在实际参考中的东西吗:

成员:[ type: Schema.Types.ObjectId, ref: 'User', role: String ]

或者角色应该在架构中的其他位置?处理这个问题的正确方法是什么,或者有没有更合适的模式化这个问题的不同方法?

一旦我为此正确设置了架构,如果有一个示例说明如何使用此角色参考创建一些用户/组织,将会很有帮助。

【问题讨论】:

【参考方案1】:

您可以通过对现有内容稍作改动来做到这一点。我以相同的方式(文本和发件人)将消息存储在应用程序中。

你可以这样做:

members: [
    role:  
      type: String
    ,
    user:  
      type: mongoose.Schema.Types.ObjectId, 
      ref: 'User'
    
  ],

那么当你想给一个组织添加一个或多个成员时(假设你已经分别创建了一个组织和一个用户):

function addNewMember(org_id, user_id, role)    
    var member = role: role, user: user_id;
    Organization.findByIdAndUpdate(org_id, "$push": "members":member, function(err,org) 
               ...
             );)  
// you can use the $each clause to add a whole array of members at the same time too
// like so:
// "$push": "members": 
//              
//              "$each": [memberarray]
//              


当你想找到一个组织包括它的成员时,你可以这样做:

    Organization.findById(org_id) 
        .populate('members.user')
        .exec(callbackfunction);

如果您确实需要将每个成员的组织 -> 成员关系也复制为成员 -> 组织,请仔细考虑。如果这确实很重要,在成功将用户添加到组织后,您可以在回调中进行第二次查询以更新用户的 orgs 字段,就像上面一样。

【讨论】:

以上是关于具有角色的参考数组的猫鼬模式的主要内容,如果未能解决你的问题,请参考以下文章

如果用户角色(卖家与买家)有所不同,我该如何构建我的猫鼬模式?

带有数组的猫鼬模式

带有数组的猫鼬模式

没有模式的猫鼬

如何更新具有嵌入文档的猫鼬数组中的许多元素

用于多个对象数组的猫鼬嵌套模式