如何在NodeJS中用Multer/GridFS直接上传文件至MongoDB Schema?
直接在MongoDB集合里存PDF文件可行吗?
先提个醒:你的示例Schema有语法问题
你写的Schema里有几个明显错误:
- 重复用
data当字段名,MongoDB只会保留最后一个定义的data字段,前面的会被覆盖 file字段的语法不对,缺了大括号,也没指定正确的类型
直接把PDF存进MongoDB文档是可行的
MongoDB支持用**二进制数据(Buffer)**存储文件,Mongoose里对应的类型就是Buffer。不过有个前提:如果你的PDF文件大小超过16MB,必须用MongoDB的GridFS来存;要是文件都小于16MB,直接存在文档里完全没问题,也能满足你快速访问的需求。
正确的Schema示例
如果只存单个PDF,Schema可以这么写:
const SomeSchema = mongoose.Schema({ textData: { type: String, required: true }, dateData: { type: Date, required: true }, anotherTextData: { type: String, required: true }, pdfFile: { type: Buffer, // 用Buffer存二进制文件内容 required: true }, pdfFileName: { // 建议额外存文件名,方便后续识别 type: String, required: true }, pdfMimeType: { // 存MIME类型,比如application/pdf type: String, required: true } });
要是要存3个不同的PDF,直接扩展字段就行:
const SomeSchema = mongoose.Schema({ // 先放你的业务字段... pdf1: { data: Buffer, name: String, mimeType: String, required: true }, pdf2: { data: Buffer, name: String, mimeType: String, required: true }, pdf3: { data: Buffer, name: String, mimeType: String, required: true } });
聊聊这么做的优缺点
好处
- 业务数据和文件存在同一条文档里,查询时一次就能拿到,不用额外调用文件存储服务,确实能实现快速访问
- 不用单独维护一套文件存储系统,架构更简单
坏处
- MongoDB单条文档最大只能存16MB,超过这个大小的文件必须用GridFS
- 存太多二进制文件会让集合体积暴涨,备份、迁移数据库的时候会更麻烦
- 查询文档时会把整个二进制文件一起加载,要是你只需要业务字段,会浪费网络带宽
额外说下GridFS
如果你的PDF可能超过16MB,或者以后要存大量文件,建议用GridFS。它会把大文件拆成256KB的小块存,同时保存文件元数据,Mongoose也有插件能快速集成。不过GridFS查询时需要拼接块,访问速度比直接存文档慢一点,但胜在支持大文件。
内容的提问来源于stack exchange,提问作者RekusuM
相关产品推荐
相关产品推荐

