Mongoose find()返回空数组:MongoDB数据读取失败求助
解决Mongoose查询MongoDB返回空数组的问题
核心问题排查与修复方案
1. 数据库连接未指定目标库
你的MongoDB连接URI缺少目标数据库名称,导致Mongoose默认连接到test数据库,而你的数据实际存储在travel-app库中。
修复:修改连接字符串,在末尾添加数据库名:
const dbURI = 'mongodb+srv://<用户名>:<密码>@travel-app.jdkjive.mongodb.net/travel-app?retryWrites=true&w=majority';
2. 模型与集合名称不匹配
Mongoose默认会将模型名转换为小写复数形式的集合名。你定义模型时用了'Trips',但Mongoose会自动查询trips(全小写)集合,而你的实际集合是Trips(首字母大写)。
修复:定义模型时显式指定集合名称:
const Trip = mongoose.model('Trip', tripSchema, 'Trips'); // 第三个参数强制指定关联的集合为'Trips'
3. Schema字段类型与数据库数据不匹配
- Schema中
cost字段定义为String,但数据库里的cost是数字类型({"$numberInt":"500"}),Mongoose的类型校验会过滤掉不匹配的文档。 - Schema中
startdate/enddate是Date类型,但数据库里存储的是字符串格式日期,同样会导致类型不匹配。
修复:调整Schema字段类型匹配数据实际存储格式:
const tripEventSchema = new mongoose.Schema({ name: String, description: String, startdate: String, // 改为String匹配数据库中的日期字符串 enddate: String, cost: Number, // 改为Number匹配数据库中的数字类型 tripevent: String }); const tripSchema = new mongoose.Schema({ name: String, description: String, startdate: String, enddate: String, tripevents: [tripEventSchema] });
4. 验证模型导入路径正确性
路由代码中导入模型的路径是../models/event,确认你的模型文件是否确实在该路径下(比如文件名是否为event.js),如果文件名是trip.js,需要修正路径:
const Trip = require('../models/trip'); // 确保路径与实际文件名一致
验证步骤
- 重启服务器后重新请求
localhost:3000/events - 在数据库连接成功的回调中添加日志,确认当前连接的数据库:
mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log('Connected to the database'); console.log('Current database:', mongoose.connection.db.databaseName); // 输出当前连接的库名 }) .catch(err => { console.error('Error connecting to the database:', err); });
内容的提问来源于stack exchange,提问作者cw23
相关产品推荐
相关产品推荐

