使用节点js中的mongoose将字段添加到模式

时间:2016-05-30 14:05:31

标签: node.js mongodb mongoose scheduled-tasks mongoose-populate

我正在尝试编写一个采用活动所需参数的模式。我想添加一个字段'activityParameters',它将根据activityType的具体情况而定。假设activityType是电子邮件,那么activityParameters应该存储详细信息,如'to:String,from:String,subject:String,body:String',如果活动是“export”,那么它应该存储像'path:String'这样的参数。不同类型的活动将具有不同的参数。请帮我解决这个问题。

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}

});

1 个答案:

答案 0 :(得分: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架构来验证模型,然后再将它们保存到mongoose。看看这个,例如:https://github.com/litixsoft/lx-valid