Mongoose聚合$lookup关联查询as字段返回空数组解决方案
问题根因
Mongoose 默认会将模型名转换为全小写复数格式作为 MongoDB 中实际存储的集合名。你定义模型时传入的名称是Seller,又没有手动指定集合名,因此数据库中真实的卖家集合名是sellers,而非Seller。$lookup的from参数需要填写MongoDB中真实存在的集合名,你填了Seller匹配不到对应集合,自然返回空的关联结果。
注意:Mongoose的
populate()方法是封装过的语法,ref字段填模型名即可,但aggregate()是直接调用MongoDB原生聚合能力,必须填写数据库中真实的集合名,这是非常容易踩的混淆点。
修复方案
将$lookup中from字段的值改为真实集合名sellers即可,修正后的聚合代码:
const aggregateOrdersWithSellerInfo = await Order.aggregate([ { $lookup: { from: 'sellers', localField: 'seller', foreignField: '_id', as: 'seller_info', }, }, ]).exec();
修改后重新运行代码,就能得到预期的关联卖家信息。
避坑技巧
如果不想被默认命名规则困扰,可以在定义Schema时通过配置项手动指定集合名,强制集合名和你预期的一致:
// 定义Seller模型时手动指定集合名为'Seller' const sellerSchema = new mongoose.Schema({ firstName: { type: String }, }, { collection: 'Seller' }); const Seller = mongoose.model('Seller', sellerSchema);
日常开发更推荐遵循Mongoose默认的小写复数命名规范,统一命名风格能减少很多不必要的排查成本。
内容的提问来源于stack exchange,提问作者Dashiell Rose Bark-Huss
相关产品推荐
相关产品推荐

