我是Mongoose的新手,并且想知道是否有可能根据查询动态添加一些参数的验证器。例如,我有一个如下所示的模式:
var user = new Schema({
name: { type: String, required: true },
email: { type: String, required: true },
password: { type: String, required: true },
city: { type: String },
country: { type: String }
});
对于简单的注册,我强迫用户提供名称,电子邮件和密码。顶部的架构是确定的。现在稍后,我想强迫用户提供城市和国家。 例如,是否可以根据需要使用参数city和country更新用户的文档?我避免重复如下的用户模式:
var userUpdate = new Schema({
name: { type: String },
email: { type: String },
password: { type: String },
city: { type: String, required: true },
country: { type: String, required: true }
});
答案 0 :(得分:1)
在这种情况下,您需要做的是拥有一个模式,并使您的required
成为允许null
和String
的函数:
var user = new Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
city: {
type: String,
required: function() {
return typeof this.city === 'undefined' || (this.city != null && typeof this.city != 'string')
}
}
});
您可以提取它并使其成为外部函数,然后将其用于county
等。
这是强制性的,但是您也可以为其设置null
。这样,您可以在开始时将其设置为null,然后在以后进行设置。
Here is the doc on required
。
答案 1 :(得分:1)
据我所知,不,这是不可能的。
猫鼬模式是在集合而非文档上设置的。 您可能有2个猫鼬模型指向具有不同Schema的同一集合,但这实际上需要具有重复的Schema。
就您个人而言,我会创建一个单一的自制模式,例如数据结构和一个函数,当将其提供给数据结构时,将创建两个版本的Schema。
例如:
const schemaStruct = {
base : {
name: { type: String, required: true },
email: { type: String, required: true },
password: { type: String, required: true },
city: { type: String },
country: { type: String }
}
addRequired : ["city", "country"]
}
function SchemaCreator(schemaStruct) {
const user = new Schema(schemaStruct.base)
const schemaCopy = Object.assign({}, schemaStruct.base)
schemaStruct.addRequired.forEach(key => {
schemaCopy[key].required = true;
})
const updateUser = new Schema(schemaCopy);
return [user, updateUser];
}