我正在研究Mongodb和我使用Mongoose,我想创建一个非常动态的注册过程。我使用Passport管理了注册的第一步,一切正常,我创建了用户并且它存在于数据库中。现在我的注册过程将继续,用户必须选择一个"角色":你是什么类型的用户?有两种选择:"基本"和"高级"。 Basic只有3个属性,advanced有3个基本属性和其他几个属性。
我需要扩展userSchema
或根据该角色添加新字段,但在一周后它还没有工作,我尝试了很多NPM
,如: mongoose-关系或 mongoose-schema-extend 。
这基本上就是我所拥有的:
userSchema = new Schema({
id : Number,
email : { type: String, required: true },
role : { type: String, required: true },
profile : { ... } // Profile fields are different for each role.
});
// profile 1
basicSchema = new Schema({
info1 : { type: String, required: true },
info2 : { type: String, required: true },
info3 : { type: String, required: true }
});
// profile 2
advancedSchema = new Schema({
info1 : { type: String, required: true },
info2 : { type: String, required: true },
info3 : { type: String, required: true },
info4 : { type: String, required: true },
info5 : { type: String, required: true },
info6 : { type: String, required: true }
});
用户已经存在,他在屏幕上需要选择一个角色并填充所选的个人资料。
有关我使用 nodejs 和 expressjs 的信息。
我希望你能提供帮助。感谢。
答案 0 :(得分:3)
使用mongoose-schema-extend:
通过npm安装:$ npm install mongoose-schema-extend
使用您的代码的示例:
var mongoose = require('mongoose'),
extend = require('mongoose-schema-extend');
var Schema = mongoose.Schema;
var userSchema = new Schema({
id : Number,
email : { type: String, required: true },
role : { type: String, required: true },
},{ collection : 'users' });
//profile 1
var basicSchema = userSchema.extend({
info1 : { type: String, required: true },
info2 : { type: String, required: true },
info3 : { type: String, required: true }
});
//profile 2
var advancedSchema = userSchema.extend({
info1 : { type: String, required: true },
info2 : { type: String, required: true },
info3 : { type: String, required: true },
info4 : { type: String, required: true },
info5 : { type: String, required: true },
info6 : { type: String, required: true }
});
答案 1 :(得分:2)
这就是你想要的。 "继承"的概念和歧视性的领域。试一试。我用它并创造奇迹。基本上,您有3种类型的用户:基本,高级和专家。每个都基于您的核心/基础模型,然后使用您需要的额外属性进行扩展,为每个角色定义一个继承。
这给你带来了很多好处,主要是:mongoose会填充相应的模型,并在派生模型中进行任何验证等。