我正在尝试自学node.js,来自Rails,我想建立这种关系:
我如何在模特中做到这一点?
//for user
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String
});
module.exports = mongoose.model('User', UserSchema);
//for group
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var GroupSchema = new Schema({
name: String
});
module.exports = mongoose.model('Group', GroupSchema);
Run Code Online (Sandbox Code Playgroud)
此外,如果这个人讨厌的话,我想允许主持人将某人赶出小组.我如何定位属于某个组的用户然后删除该用户.它似乎比传统的CRUD方法更复杂.我是否需要嵌套资源,例如rails或等效资源?
Mongoose有一个名为population的功能,您可以使用它来建立"关系"(MongoDB仅对关系提供有限的支持).
您的架构看起来像这样:
var UserSchema = new Schema({
name : String,
group: { type: Schema.Types.ObjectId, ref: 'Group' }
});
var GroupSchema = new Schema({
name : String,
users : [ { type: Schema.Types.ObjectId, ref: 'User' } ]
});
Run Code Online (Sandbox Code Playgroud)
换句话说:用户模型具有group
指向用户所属组的users
属性,而组模型具有包含对属于该组的用户的引用的属性(数组).
要将用户关联到组(假设group
它是一个组实例的变量):
user.group = group;
user.save(...);
Run Code Online (Sandbox Code Playgroud)
并将用户添加到组:
group.users.push(user);
group.save(...);
Run Code Online (Sandbox Code Playgroud)
但是,您应该知道MongoDB文档中的数组属性具有有限的可伸缩性.我认为数组中的几十个项目可以正常工作,但是当一组中的用户数量预计会达到数千时,这可能不是一个可行的解决方案.在这种情况下,您可能应该考虑"联结集合"(类似于SQL的"联结表").
要从特定组中删除用户,我认为您需要使用.update()
:
Group.update({ _id: group._id }, { $pull : { users : user._id }})
Run Code Online (Sandbox Code Playgroud)