使用Nodejs将文件存储在mongodb中

时间:2017-07-25 21:47:52

标签: javascript node.js mongodb mongoose

我将文件保存在服务器的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之前压缩缓冲区,然后在将二进制文件发送到客户端之前解压缩二进制文件?这会让整个过程更快吗?我错过了什么吗?

3 个答案:

答案 0 :(得分:4)

似乎您正在尝试使用mongoDb保存大量信息。

我可以为您的案例考虑3种不同的选择

云服务

  • 正如其他人已经在这里评论的那样,如果您要保存的文件是压缩文件,即使它是一个很小的文件,新的压缩方法也无法为您提供帮助。 在这种情况下,我的建议是使用一些已经针对您尝试保存和检索的信息进行了优化的网络云服务,如果您可以使用Cloudinary的图像(也有免费服务),那么您可以对其进行测试。

本地存储和在DB中保存路由

  • 其他解决方案可能是将编码后的数据存储在 .txt 文件中,然后将其存储在云中或文件系统中,然后仅将路由保存在数据库中。这样,您将不依赖于mongoDB的速度来检索它,但是您将有一个很好的方法来知道文件的位置。

使用MongoDB和GridFS

  • 这样,您可以使用特定的方法在MongoDB中存储信息,当您处理16mb的文件时,建议使用此方法。 正如Official Documentation所说:
  

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的图像,除非您所提供的图像对质量和分辨率的依赖性很大,否则就不会发生这种情况。请先压缩图像,然后再存储在前端或后端(由您选择),如果在前端本身上进行压缩,则将减少数据包的传输时间。

Discussion on scale of GridFS

Module for node.js side compression

GridFS