我正在尝试编写一个采用活动所需参数的模式。我想添加一个字段'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}
});
答案 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。