You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法通过Mongoose的populate访问关联对象的子字段?

解决Mongoose Populate后模板无法访问关联文档子字段的问题

这个问题我之前也踩过坑!原因很明确:你通过populate拿到的customerId是Mongoose Document实例,不是普通的JavaScript对象——它带着Mongoose封装的一堆额外属性和getter/setter方法(就是你控制台看到的$、$init这些),模板引擎没法正确解析它的嵌套字段。

给你两个可行的解决方案,优先推荐第一个:

方案1:使用.lean()(推荐,性能更优)

在查询链里加上.lean(),让Mongoose直接返回普通JS对象,这样模板就能正常访问子字段了:

router.get('/list', (req, res) => { 
  Program.find()
    .populate('customerId')
    .lean() // 关键:将Mongoose文档转为普通JS对象
    .exec((err, docs) => { 
      if (!err) { 
        res.render("program/list", { list: docs }); 
      } else { 
        console.log('Error in retrieving program list :' + err); 
      } 
    }); 
});

方案2:手动转换为普通对象

如果因为某些原因不能用.lean(),可以在渲染前把每个文档转成普通对象:

router.get('/list', (req, res) => { 
  Program.find().populate('customerId').exec((err, docs) => { 
    if (!err) { 
      // 把每个Mongoose Document实例转为普通JS对象
      const plainPrograms = docs.map(program => program.toObject());
      res.render("program/list", { list: plainPrograms }); 
    } else { 
      console.log('Error in retrieving program list :' + err); 
    } 
  }); 
});

改完之后,你在模板里用{{this.customerId.lastName}}就能正常输出客户姓氏了。

另外补充个小技巧:如果用的是EJS这类支持直接调用方法的模板,也可以临时用<%= this.customerId.get('lastName') %>来获取值,但显然转成普通对象的方式更通用,也更符合日常开发习惯。

内容的提问来源于stack exchange,提问作者R H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:33:11