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
相关产品推荐
相关产品推荐

