You are here

巧用mongoose的动态引用refPath

作者:亚艾元技术部

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


论坛: