Mongoose中按种族名称填充Race与Building文档失败问题排查
Mongoose关联填充为空问题排查与解决
1. 最可能的原因:pre钩子里this的指向错了
在pre(/^find/)钩子中,this是查询对象(Query),不是单个Race文档,所以this.name根本拿不到值,你的match条件相当于{ race: { $eq: undefined } },自然查不到任何Building文档,填充结果为空。
2. 两种修复方案
方案一:改用ObjectId关联(推荐)
把Building模型里的race字段改成存Race的ObjectId,而不是名称,这样Mongoose的populate能直接正确关联:
// Building模型 const buildingSchema = new mongoose.Schema({ // 其他字段 race: { type: mongoose.Schema.Types.ObjectId, ref: 'Race' } }); // Race模型 const raceSchema = new mongoose.Schema({ name: String, buildings: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Building' }] }); // 钩子简化,直接populate即可 raceSchema.pre(/^find/, function() { this.populate('buildings'); });
方案二:如果必须用名称关联,换post钩子处理
要是业务上必须用名称关联,就把逻辑放到post钩子(查询完成后),拿到实际的Race文档再去查对应的Building:
raceSchema.post('find', async function(docs) { for (let raceDoc of docs) { raceDoc.buildings = await Building.find({ race: raceDoc.name }); } });
3. 额外要检查的点
- 确认Building集合里确实有
race字段值和Race的name完全匹配的文档(注意大小写、空格别错) - 直接跑
Building.find({ race: '你的种族名称' })看看有没有结果,先验证查询条件本身没问题 - 检查Race模型的
buildings字段有没有正确设置ref: 'Building'
内容的提问来源于stack exchange,提问作者shivetay
相关产品推荐
相关产品推荐

