作者:亚艾元技术部
我们在帮助客户构建一个业务系统的时候,选用了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。后续开发,改动会很小。