Mongoose 如何填充猫鼬子文档';具有动态引用的虚拟阵列?

Mongoose 如何填充猫鼬子文档';具有动态引用的虚拟阵列?,mongoose,Mongoose,我可以在Mongoose中的子文档数组中填充动态引用(带有“refPath”)虚拟字段吗 数据结构如下所示 Group - Members -> User 代码:模型/模式 let MemberSchema = new Schema({ userId: { type: Schema.Types.ObjectId, refPath: 'userRef', required: true }, userRef: { type: String,

我可以在Mongoose中的子文档数组中填充动态引用(带有“refPath”)虚拟字段吗

数据结构如下所示

Group
 - Members -> User
代码:模型/模式

let MemberSchema = new Schema({
  userId: {
    type: Schema.Types.ObjectId,
    refPath: 'userRef',
    required: true
  },
  userRef: {
    type: String,
    required: true,
    enum: ['Admin', 'User'],
    default: 'Admin'
  },
  isCreator: {
    type: Boolean,
    required: true,
    default: false
  },
  isManager: {
    type: Boolean,
    required: true,
    default: false
  },
  alias: {
    type: String,
    required: true
  },
  joined: {
    type: Number,
    required: true,
    default: UTIL.getTimestamp()
  }
}, {
  toObject: {
    virtuals: true
  },
  toJSON: {
    virtuals: true
  }
})

MemberSchema.virtual('user', {
  ref: (doc: IMember) => doc.userRef,
  localField: 'userId',
  foreignField: '_id',
  justOne: true
})

let GroupSchema = new Schema({
  title: {
    type: String,
    required: true
  },
  slug: {
    type: String,
    required: true,
    default: randomstring.generate({
      length: CONFIG.GROUP_NAME_LENGTH,
      charset: CONFIG.GROUP_NAME_CHARSET
    })
  },
  updated: {
    type: Number,
    required: true,
    default: UTIL.getTimestamp()
  },
  members: [MemberSchema]
}, {
  toObject: {
    virtuals: true
  },
  toJSON: {
    virtuals: true
  }
})

export default model('Group', GroupSchema)
代码:控制器

export function get(req, res) {
  GroupModel
  .findOne({
    slug: req.params.slug
  })
  .populate({
    path: 'members.user'
  })
  .exec()
  .then((data) => {
    if (data) {
      res.status(200).json(data)        
    } else {
      res.status(404).send()
    }
  })
  .catch((err) => {
    res.status(res.statusCode).send()
    console.log(err)
  })
}
如果我将{model:'Admin'}添加到填充选项中,我将获得一个填充用户,但这完全违背了目的


请帮帮我,我已经做了将近24小时了

我建议将
userId
更改为
user
,并通过将
refPath
userRef
更改为
成员来填充它。userRef

let MemberSchema = new Schema({
  user: {
    type: Schema.Types.ObjectId,
    refPath: 'members.userRef',
    required: true
  },
  userRef: {
    type: String,
    required: true,
    enum: ['Admin', 'User'],
    default: 'Admin'
  },
...
})
...

////// Controller:

GroupModel
  .findOne({
    slug: req.params.slug
  })
  .populate({
    path: 'members.user'
  })


我建议将
userId
更改为
user
,并通过将
refPath
userRef
更改为
members来填充它,而不是使用虚拟用户。userRef

let MemberSchema = new Schema({
  user: {
    type: Schema.Types.ObjectId,
    refPath: 'members.userRef',
    required: true
  },
  userRef: {
    type: String,
    required: true,
    enum: ['Admin', 'User'],
    default: 'Admin'
  },
...
})
...

////// Controller:

GroupModel
  .findOne({
    slug: req.params.slug
  })
  .populate({
    path: 'members.user'
  })


您是否尝试在虚拟字段中使用
refPath
?请参阅,mongoose允许将
refPath
与虚拟populateNope一起使用,虚拟字段中的refPath不起作用。MemberSchema.virtual('user',{refPath:'doc)=>doc.userRef,localField:'userId',foreignField:'u id',justOne:true})您是否尝试了
MemberSchema.virtual('user',{ref:function(){return this.userRef;}…
?不,ref:()=>this.userRef没有在虚拟字段中尝试使用
refPath
的工作id?请参阅,mongoose允许将
refPath
与虚拟populateNope一起使用,虚拟字段中的refPath无效。MemberSchema.virtual('user',{refPath:'doc)=>doc userRef,localField:'userId',foreignField:'u id',justOne:true})您是否尝试了
MemberSchema.virtual('user',{ref:function(){返回this.userRef;}…
?否,ref:()=>this.userRef不起作用