我想基于schema.pre('save',function(..){...})
中的一些业务逻辑,将模式动态附加到特定字段。如果可能的话怎么做?
一些(简化的)模式和背景:
var fact= new Schema({
name: { type: String, required: true, index: { unique: false }}
,value: {type: {}, required: true}
,moreinfodesc: { type: String, required: false}
,createddate : { type: Date, required: true, default: Date.now, select: false } }
}, { collection: 'Fact' } );
var factSchema= new Schema({
name: { type: String, required: true, index: { unique: true }}
, valueType: { type: {}, required: true}
,isMulti: {type: Boolean, required: true }
//ACL-stuff
,directChangeRoles: {type: [String]} //i.e: [super, admin,owner]
,suggestChangeRoles: {type: [String]} //ie: [editor]
,enum: {type: [{}]}
,mixins: {type: [String]}
}, { collection: 'FactSchema' });
这是一个简化的结构,允许编辑特定“实体”的“事实”。
e.g: entityA.facts=[fact]
从模式可以看出,就{mongoose而言} fact.value
可以有任何类型。但是,我希望在运行时将其约束为中所定义的模式
FactSchema.valueType
(包含“Boolean”,“String”的字符串或更复杂的“[Tag]”)。这可能看起来很麻烦,但这是我想要出于几个原因的方式。
因此,对于fact.name=tags
的特定事实,我想在运行时为fact.value
类型分配[Tag]
。为此,我会设置一个Tag
- 架构,并像往常一样进行验证,并fact.value
对其进行验证。
我在考虑以某种方式将“[Tag]
- 架构”附加到fact.value
中的fact.pre('save',function(..){.. //validation here })
,并希望验证会神奇地发生,就好像fact.value
被分配了类型{{ 1}}在设计时而不是运行时。
最后一个问题:我不知道是否有可能做'附加',如果是,怎么做?
感谢。
答案 0 :(得分:1)
在运行时“附加”是不可能的,但您可以在路径中添加自定义验证器并将其逻辑基于当前文档状态:
答案 1 :(得分:0)
尝试使用mongoose discriminators 并且,如果需要,您可以使用以下命令在运行时更改验证:
YourModelName.schema.path('your_field_name').required(false);