Node.js+Express中Mongoose的find()不返回嵌套对象但findById()正常
Mongoose嵌套数组populate显示问题解决方案
问题本质说明
find()默认返回文档数组,findById()返回单个文档对象。你看到的works: [ [Object] ]只是Node.jsconsole.log默认只展开2层深度的显示限制,并非数据返回异常。- 你写的查询条件
{id:req.params.id}存在字段错误,Mongoose默认主键为_id而非id,该写法仅在你自定义了id字段时有效。 - 你后续要使用的查询条件
{ "works.movies._id" :movie.id }字段名错误,你的Schema中works下的关联字段是单数movie,不存在movies字段。
具体修复步骤
1. 修正populate写法,确保嵌套关联完整加载
使用完整嵌套populate配置,避免简写导致的关联加载失败:
// 以你后续要查询指定电影关联的所有工作人员需求为例 const staffList = await Staff.find({ "works.movie": movie.id // 直接匹配works.movie字段,不需要加._id }) .populate({ path: "works", populate: [ { path: "movie", model: "Movie" }, { path: "role", model: "Staff_roles" } ] }) .exec()
2. 修正EJS模板遍历逻辑
因为find()返回的是数组,需要先遍历staff数组,再遍历每个staff的works字段:
<% staffList.forEach(staff => { %> <div> <h3>工作人员:<%= staff.name %></h3> <ul> <% staff.works.forEach(work => { %> <li>电影:<%= work.movie.title %>,职位:<%= work.role.name %></li> <% }) %> </ul> </div> <% }) %>
如果你确认查询仅返回1条数据,可以直接取数组第一项,或改用findOne查询:
// 方式1:find查询后取第一项 const staff = (await Staff.find({_id: req.params.id}).populate(/* 上述populate配置 */).exec())[0] // 方式2:改用findOne const staff = await Staff.findOne({_id: req.params.id}).populate(/* 上述populate配置 */).exec()
3. 验证数据完整性
如果需要查看完整的返回结构,避免console.log深度限制截断,使用以下方式打印:
console.log(JSON.stringify(staffList, null, 2))
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

