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

Mongoose关联查询问题:无法获取关联集合的nameProducer字段

Mongoose关联查询问题修复

你代码里有几个关键错误导致关联查询失败,逐一修正如下:

1. ProducerSchema定义错误

你用了db.bookSchema来创建ProducerSchema,这是错误的,必须使用Mongoose的基础db.Schema构造器,bookSchema是你自定义的Schema,不能用来生成新的Schema。

2. 模型名称与ref不匹配

bookSchema里producer字段的ref值是'producerS',但你创建Producer模型时用的是'produceRs'(拼写错误),ref必须和模型名称完全一致,Mongoose才能定位到对应的集合完成关联。

3. 数据关联校验(必要前提)

确保Book集合中producer字段存储的是Producer集合对应文档的_id(MongoDB默认的ObjectId类型),如果存的是你自定义的Number类型id,关联会直接失效——因为Mongoose的populate是基于默认_id关联的。


修正后的完整代码

// 定义Book Schema
const bookSchema = new db.Schema({
    id: Number,
    nameBook: String,
    prices: Number,
    region: Boolean,
    producer: {
        type: db.Schema.Types.ObjectId,
        ref: 'Producer', // 与后续模型名称统一
    },
    moTA: String,
    urlImages: String
}, { versionKey: false });

// 定义Producer Schema - 修正为db.Schema
const ProducerSchema = new db.Schema({
    id: Number,
    nameProducer: String   
}, { versionKey: false });

// 创建模型,名称统一为Producer和Book,便于识别
const Producer = db.model('Producer', ProducerSchema);
const Book = db.model('Book', bookSchema);

// 查询函数,可指定populate返回的字段减少数据量
const listBook = async () => {
    try {
        const list = await Book.find({}).populate('producer', 'nameProducer');
        return list;
    } catch (error) {
        throw error;
    }
}

模板代码优化(避免报错)

为防止关联数据不存在导致的报错,先判断producer是否存在再访问属性,同时修正region的判断逻辑(它是Boolean类型,无需和1比较):

<% sachs.forEach(s => { %>
<tr>
    <th><%= s.id %></th>
    <td><%= s.nameBook%></td>
    <td><%= s.prices%></td>
    <td><%= s.producer ? s.producer.nameProducer : '无生产商' %></td>
    <td><%= s.region ? "A" : "B" %></td>
</tr>
<% }) %>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:47:35