我将文件保存在服务器的FS上,现在我想将它们保存在mongodb中。(为了更容易备份和填充)。我想存储最大4-5Mb的文件,我尝试用mongoose保存它们使用缓冲区类型。我成功保存并检索了它们,但是当我保存并检索4或5Mb等文件时,我注意到性能显着降低。
我的架构:
$('#date').datepicker('refresh')
我如何从expressjs服务器检索它们:
let fileSchema = new Schema({
name: {type: String, required: true},
_announcement: {type: Schema.Types.ObjectId, ref: 'Announcements'},
data: Buffer,
contentType: String
});
我的问题是我应该使用一些zlib压缩函数,例如' deflate'在将缓冲区保存到mongodb之前压缩缓冲区,然后在将二进制文件发送到客户端之前解压缩二进制文件?这会让整个过程更快吗?我错过了什么吗?
答案 0 :(得分:4)
似乎您正在尝试使用mongoDb保存大量信息。
我可以为您的案例考虑3种不同的选择
GridFS不会将文件存储在单个文档中,而是将文件分为多个部分或大块[1],并将每个大块存储为单独的文档。默认情况下,GridFS使用的默认块大小为255 kB;默认大小为255 kB。也就是说,GridFS将文件分为255 kB的块,最后一个块除外。
然后他们说在什么情况下您可以使用这种方式存储信息:
在某些情况下,在MongoDB数据库中存储大文件可能比在系统级文件系统上存储更为有效。
- 如果文件系统限制了目录中文件的数量,则可以使用GridFS来存储所需数量的文件。
- 当您要访问大文件部分的信息而不必将整个文件加载到内存中时,可以使用GridFS调用文件的某些部分,而无需将整个文件读入内存。
- 当您希望保持文件和元数据在多个系统和设施之间自动同步和部署时,可以使用GridFS。使用地理上分散的副本集时,MongoDB可以自动将文件及其元数据分发到许多mongod实例和设施。
希望它有用:)
答案 1 :(得分:0)
我建议您使用GridFS
,它更快捷,更易于使用。
有关更多信息,请检查以下网址:https://docs.mongodb.com/manual/core/gridfs/。
如果您对GridFS
有任何疑问,请告诉我。
答案 2 :(得分:0)
如果您绝对认为必须将图像存储在数据库中而不是文件系统或其他云服务中,那么我不会对此发表评论。
关于您的特定问题,GridFS是人们在生产中也使用的一种受人尊敬的选择,并且已经很好地实现了其目的。几年前,我个人使用过它,但是用例发生了变化,因此转移到了另一个媒介上。 (请检查人们正在讨论其性能的SO链接)
令人担忧的是,您拥有4mb的图像,除非您所提供的图像对质量和分辨率的依赖性很大,否则就不会发生这种情况。请先压缩图像,然后再存储在前端或后端(由您选择),如果在前端本身上进行压缩,则将减少数据包的传输时间。