MongoDB自动创建测试库问题:如何正确获取已有集合数据?
问题解决:Mongoose匹配已有MongoDB集合并避免创建空集合
核心问题
你遇到的问题根源是Mongoose默认会将模型名称自动复数化作为集合名:
- 你手动创建的目标集合是
journey_detail(单数) - 但通过
mongoose.model("journey_detail", journeySchema)定义模型时,Mongoose会自动将模型名转为复数形式journey_details,并尝试访问该集合;当找不到对应集合时,就会自动创建空的journey_details集合,而你的真实数据存储在journey_detail集合中,因此接口返回空数组。
解决方案
在定义模型时显式指定集合名称,覆盖Mongoose的自动复数化行为,有两种实现方式:
方式1:在Schema定义时指定集合名
修改Schema代码,添加collection属性绑定目标集合:
import mongoose from "mongoose"; export const journeySchema = mongoose.Schema({ Departure_time: String, Return_time: String, Departure_Station_Id: Number, Departure_Station_Name: String, Return_Station_Id: Number, Return_Station_Name: String, Covered_Distance: Number, Duration: Number, }, { collection: "journey_detail" }); // 显式指定目标集合名 export const journey_detail = mongoose.model("journey_detail", journeySchema);
方式2:在创建Model时指定集合名
调用mongoose.model时传入第三个参数,直接指定集合名:
import mongoose from "mongoose"; export const journeySchema = mongoose.Schema({ Departure_time: String, Return_time: String, Departure_Station_Id: Number, Departure_Station_Name: String, Return_Station_Id: Number, Return_Station_Name: String, Covered_Distance: Number, Duration: Number, }); // 第三个参数明确指定要关联的集合名 export const journey_detail = mongoose.model("journey_detail", journeySchema, "journey_detail");
额外优化点
- 请求函数判断逻辑修正:
journey_detail.find()返回的是空数组(而非null),原代码中if (!JourneyDetails)永远不会触发,可改为判断数组长度:if (JourneyDetails.length === 0) { return res.status(404).json({ message: "Journey Details not found" }); } - 连接代码清理:原代码中
mongoose.set()未传入有效参数,可移除或添加合理配置(比如关闭严格查询模式,允许查询Schema未定义的字段):mongoose.set('strictQuery', false); - 字段匹配检查:确保CSV导入的字段名(大小写、下划线等)与Schema定义的
Departure_time、Departure_Station_Id等完全一致,否则Mongoose会忽略不匹配字段,导致数据缺失。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

