如何通过在子文档中添加动态localField填充猫鼬虚拟机?

问题描述

我有两个模式。

[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 (将#修改为@)