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