我正在使用NodeJS和Mongo(Mongoose)构建用于学习目的的Web应用程序。它应该是一个职位委员会,允许用户(人力资源经理)跟踪职位空缺和候选人。我可能对Mongoose Schema造成了太多困惑,因此很乐意找到一些建议。
我有3种方案:
Company
Position
Candidate
这些是它们之间的有效交叉引用(使用mongoose.Schema.Types.ObjectId
)。
每个公司的财产均包括该公司的一系列未平仓头寸:
name: String,
logoUrl: String,
positions: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Position'
}]
每个职位都引用了自己的公司和一系列应聘者:
role: String,
salary: Number,
jobDescription: String,
company: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Company'
}
candidates: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Candidate'
}]
每个候选人都有一组职位(一个候选人可以申请多个职位)。
name: String,
surname: String,
email: String,
positions: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Position'
}]
使用.populate( )
可以管理所有这些对象并访问链接对象的特定属性。在this example中,我可以打开候选人的个人资料,阅读他所申请职位的列表,并显示拥有这些职位的公司的徽标。在this other example中,我可以打开公司的个人资料,阅读空缺列表,并查看每个空缺的候选人数量。
到目前为止,一切都很正常,✌️
现在,我的目标是向候选架构中的位置数组添加两个属性,以使其无法跟踪该应用程序的状态和人力资源经理的注释:输出应类似于this
我的候选方案现在为:
name: String,
surname: String,
email: String,
positions: [
{ detail: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Position'
},
progress: { type: String }, // keep track of the status
comment: { type: String } // keep track of internal notes
}]
我用于打开和填充候选人页面的代码是:
app.get('/:id', (req, res) => {
Candidate
.findById(req.params.id)
.populate({
path: 'positions.detail',
model: Position,
populate: {
path: 'company',
model: Company
}
})
.exec(function (err, foundCandidate) {
if (err) {
console.log(err)
} else {
res.render('candidates/show', {candidate: foundCandidate})
}
})
})
现在问题是:positions.detail
没有被填充。使用以前的模式(没有这两个新属性),我能够轻松地使用position.property
检索职位数据以及使用position.company.property
检索公司数据;现在我正在使用position.detail.property
和position.detail.company.property
,但它们不起作用:
Cannot read property 'property' of undefined
有人可以帮我吗?