Can I populate a dynamically referenced (with "refPath") virtual field in a subdocument array in Mongoose?
The data structure goes like
Group
- Members -> User
Code: models/schema
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)
Code: controller
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)
})
}
I will get a populated user if I add {model: 'Admin'} to the populate options, but that completely defeats the purpose.
Help please, I've been on this for almost 24 hours.