作者:亚艾元技术部
我们在帮助客户构建一个业务系统的时候,选用了Koa2 + mongoose + react这样的技术组合,客户需要一个工作流引擎,没有找到特别合适的,就简单的自己写了一个,用来满足客户的定制需要。
我们在定义工作流的数据结构,schema的时候,为了增加工作流的灵活性,这个时候想让它同时支持多个Model实体,用到了mongoose的动态引用:
const workflowContentStateSchema = new Schema({
//可读名字
uid: {
type: Schema.Types.ObjectId,
ref: 'User'
},
wid: {
type: Schema.Types.ObjectId,
ref: 'Workflow'
},
state: {
type: Schema.Types.ObjectId,
ref: 'WorkflowState'
},
entityId: {
type: Schema.Types.ObjectId,
required: true,
refPath: 'entityType'
},
entityType: {
type: String,
required: true,
enum: ['Report', 'Service']
},
stamp: {
type: Date,
default: Date.now,
index: true
},
});
通常定义一个引用字段都是这样的:
uid: {
type: Schema.Types.ObjectId,
ref: 'User'
},动态引用与之不同,使用了refPath属性:
entityId: {
type: Schema.Types.ObjectId,
required: true,
refPath: 'entityType'
},
entityType: {
type: String,
required: true,
enum: ['Report', 'Service']
},
如果只让工作流作用于一个Model的话,其实直接使用ref就可以了,如果是简单的两个,其实可以建立两个字段,为每一个Model建立一个字段,同时使用ref。这样就定死了。为了后续的扩展性,这里使用refPath。后续开发,改动会很小。

