Mongoose查询返回空数组求助:Express查Mongo无结果
我来帮你梳理几个最可能的原因,一步步排查问题:
1. Schema配置参数传错(最核心的问题)
你看你的模型代码,给Schema构造函数传了三个参数:字段定义、{ bufferCommands: false }、{ collection: 'plotStatuses' },但Mongoose的Schema只接受两个参数——字段定义对象和配置选项对象。第三个参数会被直接忽略,导致你手动指定的collection: 'plotStatuses'根本没生效!
Mongoose默认会把模型名(你这里是'plotStatus')处理成复数形式作为集合名,大概率会去查plot_statuses或者全小写的plotstatuses,而不是你存数据的plotStatuses集合,这直接导致查不到数据!
修复方法:把两个配置项合并到同一个对象里:
const plotStatusSchema = new Schema( { recordDate: Date, blockName: String, growerName: String, company: String, variety: String, planted: Number, region: String, yieldInKG: Number, currentRipeness: String, nextStage: String, timeToNextInDays: Number, status: Number }, { bufferCommands: false, collection: 'plotStatuses' // 把集合配置放到同一个options对象里 } );
2. 检查查询条件的匹配度
你的查询条件是{ company: req.user.companyCode },要确认这几个点:
req.user.companyCode的值是不是和示例数据里的"mycompany"完全一致?MongoDB查询是区分大小写、空格和特殊字符的,比如MyCompany和mycompany会被当成不同的值;- 可以在路由里加个日志,直接打印出
req.user.companyCode的值,验证是否符合预期:exports.plotStatuses = async (req, res) => { console.log('当前查询的companyCode:', req.user.companyCode); // 打印出来确认 const plotStatus = await PlotStatus.find({ company: req.user.companyCode }).lean(); // ...后续代码 };
3. 确认数据库连接是否正确
有时候会不小心连到测试库或者其他环境的数据库,导致查不到目标数据。可以在Mongoose连接成功后,打印当前连接的数据库名:
mongoose.connect('你的MongoDB连接地址') .then(() => { console.log('已连接数据库:', mongoose.connection.db.databaseName); });
看看是不是和你存储数据的数据库完全一致。
4. 修复错误判断逻辑+捕获查询异常
你的路由里用了if (!plotStatus)判断,但find()方法即使没查到数据,返回的也是空数组[],而空数组在JS里是truthy值,这个判断永远不会触发!而且你没有用try/catch捕获查询异常,就算数据库出错了,你也看不到错误信息。
修复后的路由代码:
exports.plotStatuses = async (req, res) => { try { const plotStatuses = await PlotStatus.find({ company: req.user.companyCode }).lean(); if (plotStatuses.length === 0) { // 用数组长度判断是否为空 return res.status(404).send('Plot Statuses not found'); } res.send(plotStatuses); } catch (err) { console.error('查询出错:', err); // 捕获并打印错误信息 res.status(500).send('服务器内部错误'); } };
5. 直接在Mongo客户端验证查询
跳过Node.js代码,直接在Mongo Shell或者Compass里执行查询:
db.plotStatuses.find({ company: "mycompany" })
如果能返回数据,说明问题出在Node.js代码里;如果不能,那要么是数据里的company字段值不符合预期,要么是集合名写错了。
内容的提问来源于stack exchange,提问作者Boris K

