基于属性

时间:2017-03-23 14:38:55

标签: node.js mongoose

我想根据架构中的另一个属性获得动态参考?

我有以下架构,其中位置可以由个人或组织控制(例如,办公楼由公司控制,而本地商店由所有者控制)。

// Has other fields - brief for simplicity.
var personSchema = new Schema({
    _id: {type: String, required: true},
    name: {type: String, required: true},
}); 
var PersonData = mongoose.model('PersonData', personSchema ); 


// Has other fields - brief for simplicity.
var organizationSchema = new Schema({
    _id: {type: String, required: true},
    name: {type: String, required: true},
    members: [{ type: String, ref: 'PersonData'}]
}); 
var OrganizationData = mongoose.model('OrganizationData', organizationSchema ); 

var locationSchema = new Schema({
    _id: {type: String, required: true},
    name: {type: String, required: true},
    controlledBy:{ 
            type: {String, enum: [ 'Organization', 'Individual']},
            controller: { type: String, ref: 'PersonData' or 'OrganizationData'}
    }
});

我想一个选择是将两个字段放入" controlledBy"但不确定这是否是最好的方法呢?

controlledBy:{ 
    type: {String, enum: [ 'Organization', 'Individual']},
    individual: { type: String, ref: 'PersonData' },
    organization: { type: String, ref: 'OrganizationData'}
}

有了上述内容,我想我可能会放弃那种类型吗?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,我使用了您使用的相同解决方案。 但是后来,我被介绍给了Dynamic Referencing with refPathrefrefPath 之间的区别在于,使用 refPath,您可以配置 Mongoose 为每个文档使用的模型,而不是使用 ref 的硬编码字符串。 我建议您的解决方案是:

controllerType:{ 
  type: String,
  enum: [ 'Organization', 'Individual']
},
controllerId: {
  type: Schema.Types.ObjectId,
  refPath: 'controllerType'
}