具有角色的参考数组的猫鼬模式
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 字段,就像上面一样。
【讨论】:
以上是关于具有角色的参考数组的猫鼬模式的主要内容,如果未能解决你的问题,请参考以下文章