猫鼬:如何使用交叉引用填充嵌套模式?

时间:2018-09-20 17:21:09

标签: node.js mongodb mongoose

我正在使用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.propertyposition.detail.company.property,但它们不起作用:

Cannot read property 'property' of undefined

有人可以帮我吗?

0 个答案:

没有答案