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

如何从Mongoose populate填充字段中输出属性?

问题分析与解决

你遇到的问题核心是populate路径错误,同时混淆了Mongoose的实际字段_id和虚拟属性id。

问题原因

  1. 你把Active文档自身的主键_id作为populate的目标路径,但_id本应是当前文档的唯一标识,不应该用来引用User集合的文档,这种设计不符合MongoDB常规用法,还会导致属性访问混淆。
  2. Mongoose的id是虚拟属性,是_id字段的字符串化版本,并非你填充后的User文档。所以activeUser.id本质是字符串,自然没有name属性,输出undefined。

正确解决方案

步骤1:修正Active模型定义

在Active模型中新增一个专门的字段(比如user)来引用User集合,不要复用自身的_id:

const mongoose = require('mongoose');

const activeSchema = new mongoose.Schema({
  // 新增引用字段,关联User模型
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  },
  // Active模型的其他字段...
});

const Active = mongoose.model('Active', activeSchema);

步骤2:正确使用populate

调整populate的路径为新增的user字段,再访问对应属性:

app.get('/', async (req,res) => {
  const activeUser = await Active.findOne({}).populate({ path: "user", model: "User" });
  console.log(activeUser.user.name); // 输出John
});

若坚持现有模型(不推荐)

如果你一定要保持用_id作为引用字段(不建议,会造成主键逻辑混乱),则需要通过_id而非id访问填充后的属性:

app.get('/', async (req,res) => {
  const activeUser = await Active.findOne({}).populate({ path: "_id", model: "User" });
  console.log(activeUser._id.name); // 输出John
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:23:20