使用Mongoose查询MongoDB Atlas集群的fs.files集合返回空数组问题排查
问题诊断与解决方案
你的问题主要出在集合名称配置错误和Schema字段名与MongoDB文档不匹配这两个核心点上,下面一步步帮你修正:
1. 修正集合名称配置
你在Schema里设置的collection: 'Chronic.fs.files'是错误的——Mongoose的collection参数只需要填写集合名,不需要带上数据库名。因为你连接MongoDB时已经指定了Chronic数据库,所以直接写fs.files即可:
export const FileSchema = new Schema({ // 字段定义稍后修正 }, { collection : 'fs.files'}); // 去掉数据库前缀Chronic.
2. 对齐Schema字段与MongoDB文档
你的Schema里有两个字段名和数据库中的文档不匹配,这会导致Mongoose无法正确映射数据:
- MongoDB里的字段是
filename,你写成了fileName - MongoDB里的主键是
_id,你写成了id
修正后的完整Schema如下:
import mongoose from 'mongoose'; const Schema = mongoose.Schema; export const FileSchema = new Schema({ _id: { type: mongoose.Types.ObjectId }, // 对应数据库的_id字段 chunkSize : { type: Number }, filename : { type: String }, // 修正为filename,和数据库字段一致 length: { type: Number }, metadata : { type: Object }, uploadDate : { type: Date } }, { collection : 'fs.files'});
3. 确认数据库连接正确性
确保你连接MongoDB时指定了Chronic数据库,连接字符串应该类似这样:
mongoose.connect('mongodb+srv://<用户名>:<密码>@集群地址/Chronic?retryWrites=true&w=majority', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('成功连接Chronic数据库')) .catch(err => console.error('连接失败:', err));
4. 可选:优化查询函数(推荐)
你可以把回调式的查询改成async/await风格,代码更易读也更易维护:
const ChronicFile = mongoose.model('File', FileSchema); export const getFiles = async (req, res) => { try { const files = await ChronicFile.find({}); console.log(files); res.json(files); } catch (err) { res.status(500).send(err); } }
为什么之前返回空数组?
- 集合名称错误:Mongoose会尝试查找名为
Chronic.fs.files的集合,而你的实际集合是fs.files,自然查不到数据 - 字段名不匹配:Mongoose默认启用严格模式(
strict: true),只有Schema中定义的字段才会被映射,字段名不一致会导致无法匹配文档,最终返回空数组
内容的提问来源于stack exchange,提问作者Justin Hu
相关产品推荐
相关产品推荐

