You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:52:37