Node.js操作MongoDB使用$lookup联表查询结果为空如何解决
问题原因
$lookup关联查询返回空数组的核心原因是关联的目标集合名配置错误:
- MongoDB原生
$lookup语法的from参数,要求填写数据库中实际存在的集合名称,不是Mongoose的模型变量名、也不是你自定义的模型别名。 - Mongoose默认规则会将你传入
mongoose.model()的第一个参数(模型名)自动转为小写、复数形式,作为实际写入MongoDB的集合名:你定义的用户模型mongoose.model('UserCGN', UserCGN),对应的实际集合名是usercgns,你代码里填的CGNModel根本不存在,自然匹配不到任何关联数据。
补充两个容易踩的同类坑:
- 如果你在定义Schema时没有手动指定
collection字段,不要自己臆想集合名,最稳妥的方式是连接数据库后执行show collections命令,查看库内真实的集合名称。 - 你当前两个模型定义中重复声明
const mongoose = require('mongoose'),如果两个模型写在同一个文件中会触发重复声明报错,拆分到不同文件则无影响。
修复方案
- 修正
$lookup中的from参数为实际的用户集合名usercgns,修正后的查询代码如下:
// 先确保你正确引入了对应的模型,CoursModel是你导出的dataCours模型实例 var coursM = await CoursModel.aggregate( [ { $lookup: { from: "usercgns", // 替换为真实存在的用户集合名 localField: "name_Cours", foreignField: "cours", as: "inventory_docs" } } ] ) console.log("coursM", coursM);
- (可选优化)如果不想记Mongoose的自动命名规则,可以在定义模型时手动指定集合名,避免后续因为命名规则不熟悉出错:
// 定义UserCGN模型时手动指定集合名为user_cgn module.exports = mongoose.model('UserCGN', UserCGN, 'user_cgn'); // 定义课程模型时手动指定集合名为course module.exports = mongoose.model('dataCours', Cours, 'course');
手动指定后,$lookup的from参数直接填你自定义的集合名即可。
修复后执行查询,就能在inventory_docs字段中拿到关联的用户数据。
内容的提问来源于stack exchange,提问作者Onisoa Tahina
相关产品推荐
相关产品推荐

