2016-05-30 15 views
1

アクティビティに必要なパラメータを取得するスキーマを作成しようとしています。 activityTypeに応じて大文字と小文字が区別される 'activityParameters'フィールドを追加したいと考えています。 activityTypeがemailの場合、activityParametersは 'to:String、from:String、subject:String、body:String'のような詳細を格納する必要があり、アクティビティが "export"の場合は 'path:String'のようなパラメータを格納する必要があります。アクティビティの種類によって、異なるパラメータが使用されます。これを行う方法を手伝ってください。ノードjsでmongooseを使用してスキーマにフィールドを追加する

var activity_type = { 
    values: 'email export'.split(' '), 
    message: 'validation failed for path `{PATH}` with value `{VALUE}`' 
}; 
var activitySchema = new Schema({ 
    activityName: String, 
    activityDescription: String, 
    executionTime: {type: Date , default: null}, 
    activityStartTime: {type: Date , default: null}, 
    activityCompletionTime: {type: Date , default: null}, 
    activityType: {type:String, enum: activity_type}, 
    //activityParameters: , 
    appName : String, 
    activityRetryCount: {type:Number,default:0}, 
    createdOn: {type:Date , default:Date.now}, 
    deletedOn: {type: Date , default: null}, 
    updatedOn: {type: Date , default: null} 

});

答えて

0

強引な型付けされたスキーマを維持して、これをmongooseで行うと、本当に良い答えはありません。

スキーマの各タイプにすべてのフィールドを指定してから、タイプに応じて使用できます(エクスポート対メッセージ)。

var activitySchema = new Schema({ 
    ... 
    activityParameters: { 
     to:String, 
     from:String, 
     path:String 
}}); 

あなたは改善するサブタイプごとにキーを持っ検討するかもしれない:

var activitySchema = new Schema({ 
    ... 
    emailActivityParameters:{ 
     to:String, 
     from:String, 
    }, 

    exportActivityParameters:{ 
     path:String, 
    } 
}); 

活動の種類に応じて、各「サブドキュメント」にアクセスするためにはかなり簡単だろう。

最後に、あなたはactivityParametersと呼ばれるキーを持っており、それは自由形式のJSONも持つことができます。この場合

var activitySchema = new Schema({ 
    ... 
    activityParameters: {} 
}); 

カスタムバリデータを使用してスキーマの整合性を維持することができます。

これらのアプローチが魅力的でない場合、おそらくmongooseは適切なツールではありません。低レベルのmongoドライバを使用して、Typescriptやjsonスキーマのようなものを使って、モデルをマングースに保存する前に検証することができます。これを確認してください(例:https://github.com/litixsoft/lx-valid)。

関連する問題