【发布时间】:2018-01-01 00:22:24
【问题描述】:
我将文件保存在服务器的 FS 上,现在我想将它们保存在 mongodb 中。(以便于备份和东西)。我想存储最大 4-5Mb 的文件,我尝试用 mongoose 保存它们使用 Buffer 类型。我成功保存并检索了它们,但是当我保存和检索 4 或 5Mb 等文件时,我注意到性能显着降低。
我的架构:
let fileSchema = new Schema({
name: {type: String, required: true},
_announcement: {type: Schema.Types.ObjectId, ref: 'Announcements'},
data: Buffer,
contentType: String
});
我如何从 expressjs 服务器中检索它们:
let name = encodeURIComponent(file.name);
res.writeHead(200, {
'Content-Type': file.contentType,
'Content-Disposition': 'attachment;filename*=UTF-8\'\'' + name
});
res.write(new Buffer(file.data));
我的问题是我是否应该使用一些 zlib 压缩函数(如“deflate”)在将缓冲区保存到 mongodb 之前对其进行压缩,然后在将二进制文件发送到客户端之前对其进行解压缩?这会让整个过程更快吗?我错过了什么吗?
【问题讨论】:
-
对此没有明确的答案。这取决于您存储的数据类型?如果它是 jpeg/png,它可能已经被压缩并且额外的压缩将无济于事。如果文件的大小很小,那么它也可能无助于压缩。如果文件很大,接下来的事情 DB 不是很好的选择。
-
@TarunLalwani,如果我错了,请纠正我。存储图像的标准方法是将图像存储在 s3 还是 cloudinary 中,(或者我猜甚至 imgur 也可以)然后在 DB 中存储所存储图像的 URL?如果是这样的话,我很难理解为什么从外部网站的数据库中检索数据比我自己的要快。
-
在 DB 中存储没有意义,因为它们没有针对存储此类内容进行优化。虽然 S3 和 Cloufront 针对提供此类文件、缓存、附近节点以降低延迟和一切进行了优化。这就是使用外部服务有意义的原因。但是如果你想降低成本,你仍然可以选择 mongodb,但是这个成本会随着你的代码本身投入到开发中
-
听起来你应该使用GridFS
-
@TarunLalwani 有一个明确的答案 - 正是这样:不要使用数据库来存储文件......将文件存储在数据库之外,数据库应该存储的唯一内容是访问真实所需的信息文件,例如将其存储在 AWS S3 存储桶中......并将文件名和存储桶名称存储在 DB 字段中,以便访问它的人获取有关实际文件存储位置的信息,并可以在以后检索它。
标签: javascript node.js mongodb mongoose