具有角色的refs数组的Mongoose模式

时间:2014-09-20 01:44:15

标签: node.js mongodb mongoose role refs

我对NoSQL的做法很新,所以请原谅我,如果我只是想这个完全错误(我觉得我是)。

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

目前在我的用户架构中我有:

  
    

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

  

在我的组织架构中我有:

  
    

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

  

但我也希望附上会员或所有者的角色。

这是我应该在实际参考中添加的东西,如:

  
    

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

  

或该角色应该在架构的其他位置?处理这种情况的正确方法是什么,或者采用不同的方式对此进行图式化更合适?

一旦我为此正确设置了架构,有一个如何使用这个roled ref创建一些用户/组织的示例会很有帮助。

1 个答案:

答案 0 :(得分:2)

你可以通过对你所拥有的东西进行一些小改动来做到这一点。我以相同的方式将消息存储在应用程序中(文本和发件人)。

这是你能做的:

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字段,就像上面一样。