我如何建立关系用户属于Mongoose和Node.js中的群组?

1 mongoose mongodb node.js

我正在尝试自学node.js,来自Rails,我想建立这种关系:

  • 组has_many用户,用户belongs_to组

我如何在模特中做到这一点?

//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或等效资源?

rob*_*lep 7

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)