问题描述
我有两个模式。
[1]联系人架构,其中包含姓名,电子邮件,personID字段和
[2]包含_profile和_contacts字段的公司架构。
var CompanySchema = new Schema({
_id: Schema.Types.ObjectId,_profile: Schema.Types.Mixed,_contacts:[ContactSchema],},{ strict: false,toJSON: { virtuals: true } })
var ContactSchema = new Schema({
type: Schema.Types.Mixed,// [{
// _id: ObjectId('123')
// personID: {type: Schema.Types.ObjectId,ref: SCHEMAS.USER},// name: String,// email: String,// }]
},{ strict: false })
ContactSchema.set('toObject',{ virtuals: true,getters: true});
ContactSchema.set('toJSON',{ virtuals: true });
我在ContactSchema上有一个名为_participantProfile的虚拟字段,如下所示
ContactSchema.virtual('_participantProfile',{
ref: SCHEMAS.PERSON,localField: 'personID',foreignField: '_id',justOne: true,});
function listEntities(query,callback) {
const { filter,sort,skip,limit,options } = query
this.find(filter,options)
.sort(sort)
.limit(limit)
.skip(skip)
.populate( {path: '_contacts._participantProfile'})
.exec(callback)
}
该应用程序的体系结构使得联系人详细信息可能具有也可能没有personID。
例如,如果用户手动输入联系人,则它将没有personID,并且如果用户链接联系人个人资料,则联系人架构将具有personID。
案例A(手动添加)
[ { _id: 5f78e84989d302fc0f1c26b2,name: 'John',email: 'John@email.com',personID: '' } ]
案例B(链接)
[ { _id: 5f78e84989d302fc0f1c26b2,personID: '123456789' } ]
当公司架构包含所有具有personID的联系人时,它运行良好,但是当任何一个联系人都不包含personID时,我将收到以下错误,应用程序崩溃。
CastError: Cast to ObjectId Failed for value "" at path "_id" for model "Person"
尝试:1 =>我尝试了以下方法,但是没有用。有了这段代码,我也无法获得带有personID的虚拟机。
ContactSchema.virtual('_participantProfile',localField: doc => doc._contacts.personID ? 'personID': '_id',});
是否有任何方法可以根据此(personID)字段的可用性将localField动态引用到personId或_id?
OR
是否可以基于personID添加虚拟机? [如果有personID,请添加虚拟,否则不添加]?
请注意,我经历过许多StackOverflow问题和Automattic /猫鼬问题,但无法找到解决方案,因为在我的情况下,我将虚拟对象添加到联系人数组中的每个项目中。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)