Nodejs:MongoDB中的一对多

时间:2016-07-28 10:43:10

标签: node.js mongodb mongoose

我正在开发我在Mongo的第一个数据库。我使用Mongoose来创建模型。我想实现一对多的多重关系。有三种模型:用户,组和角色模型。用户可以属于多个组,并且可以在同一组中拥有多个角色。例如,John属于组1和2.组1中的Juan是管理员,组2是管理员和超级用户。下面我展示了关系模式:

Schema relational

我创建了以下模型:

的usermodel

 const roleSchema = new Schema({
      name: {type: String, unique: true},
      code: {type: String, unique: true},
      description: String
    }, {
      timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'}
    });
    const RoleModel=mongoose.model('role', roleSchema);

的RoleModel

   const groupSchema = new Schema({
      name: {type: String, unique: true}
    }, {
      timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'}
    });
const GroupSchema = mongoose.model('group', groupSchema);

GroupModel

const groupuserroleSchema = new Schema({
  role: {type: Schema.Types.ObjectID, ref: 'role'},
  user: {type: Schema.Types.ObjectID, ref: 'user'},
  group: {type: Schema.Types.ObjectID, ref: 'group'}
});
const GroupUserRoleModel = mongoose.model('group_user_role', groupuserroleSchema);

GroupUserRoleModel

new MyClass(42)

我的问题是:

  1. 这可以实现吗?
  2. 当我想创建一个GroupUserRole文档时,该怎么做?
  3. 我已经看到有关该方法的信息填充在mongoose(Populate)中,但只有两个模型之间存在一个关系 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

模型化

好的,这里的问题是,你想创建一个"关系数据库" -like使用mongodb还是你想建模一个No#34; NoSQL"类数据库?

我看到你想要做什么,重现关系模式。这是一个常见的错误,这里解释了为什么要避免这种情况。使用mongodb,你应该注意一些新的概念,比如一个新的关系(一个到一些,多个到一些)some代表一个组/一小部分文档的列表(我们可以称之为子文档) )。 mongodb的主要好处是尽可能减少收集。

如果您想要解释子文档在mongoose中的工作方式,请点击链接http://mongoosejs.com/docs/subdocs.html

为了解决你的问题,我想(如果你认为你没有那么多的团体和角色),你应该这样做:

<强>的usermodel

const roleSchema = new Schema({
      name: {type: String, unique: true},
      code: {type: String, unique: true},
      description: String
 }, {
      timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'}
 });

const groupSchema = new Schema({
    name: {type: String, unique: true}
}, {
    timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'}
});

const userSchema = new Schema({
    username: {type: String, unique: true},
    first_name: String,
    middle_name: String,
    first_surname: String,
    second_surname: String,
    email: String,
    password: String,
    roles: [roleSchema],
    groups: [groupSchema]
}, {
    timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'}
});
const UserModel = mongoose.model('user', userSchema);

现在你有一个系列&#39; User&#39;您可以在哪里管理您的用户,他们的群组和他们的角色。

用法

var user = new UserModel({ name: "Odonno", groups: [{ name: 'Admin' }, { name: 'User' }] })
user.save(callback);

拥有模型后,您可以轻松设置组和角色,然后将其保存在数据库中。