mongoose动态附加架构以便即时验证

时间:2012-05-18 18:52:27

标签: mongodb mongoose

我想基于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}}在设计时而不是运行时。

最后一个问题:我不知道是否有可能做'附加',如果是,怎么做?

感谢。

2 个答案:

答案 0 :(得分:1)

在运行时“附加”是不可能的,但您可以在路径中添加自定义验证器并将其逻辑基于当前文档状态:

https://gist.github.com/2789681

答案 1 :(得分:0)

尝试使用mongoose discriminators 并且,如果需要,您可以使用以下命令在运行时更改验证:

YourModelName.schema.path('your_field_name').required(false);