0

のビジネス ロジックに基づいて、スキーマを特定のフィールドに動的にアタッチしたいと考えています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]

スキーマからわかるようfact.valueに、マングースに関する限り、任意の型を持つことができます。FactSchema.valueTypeただし、実行時に("Boolean"、"String"、または "[Tag]" などのより複雑なものを含む文字列)で定義されているスキーマに制約したいと考えています 。これはすべて面倒に思えるかもしれませんが、いくつかの理由から、これが私が行きたい方法です。

したがって、特定の事実について、実行時に型fact.name=tagsを割り当てたいと しましょう。このために、私は通常のように検証を使用して -schema をセットアップし、それに対して検証を行います。fact.value[Tag]Tagfact.value

[Tag]-schema をfact.value何らかの形で "アタッチ" することを考えていたので、実行時ではなく設計時にタイプが割り当てられたかのfact.pre('save',function(..){.. //validation here })ように検証が魔法のように行われることを願っていました。fact.value[Tag]

最後に質問です。その「アタッチ」が可能かどうかはわかりません。

ありがとう。

4

2 に答える 2

1

実行時に「アタッチ」することはできませんが、パスにカスタムバリデーターを追加し、現在のドキュメントの状態に基づいてロジックを作成することができます。

https://gist.github.com/2789681

于 2012-05-25T18:27:45.367 に答える