为了账号安全,请及时绑定邮箱和手机立即绑定

MongoDB 中的小图像(<4MB),我应该使用 gridFS 吗?

MongoDB 中的小图像(<4MB),我应该使用 gridFS 吗?

森栏 2023-10-14 11:13:59
这里的问题和请求相当简单,但尚未找到明确的答案。我是 multer、Node 和 MongoDB 的新手,这比我预想的要困难得多。我想在 MongoDB 中存储小 JPEG,每个可能不超过 4 MB。据我所知,BSON 最大可达 < 16 MB,如果更大,则必须由 gridfs 处理。这些图像只是我收藏中每个 _id 的个人资料照片。到目前为止,我已经能够仅使用 multer 在本地上传文件。现在我正在尝试弄清楚如何以正确的方式在 MongoDB 中获取这些图像。这么小的图像需要 gridfs 吗?执行此操作的最佳计划是什么?我正在想象将文件更新插入数据库,但想知道这是否只会上传文件名而不是图像本身?我将如何改变我的“模式”来适应这个?如果您知道如何更改下面的更新插入(相对于进入 gridFS),那将是理想的选择。这是代码。数据库更新:const updatePlace = async (place) => {  const database = await connect();  return database.collection('place').findOneAndUpdate(    { _id: new ObjectID(place._id) },    {      $set: {        name: place.name,        category: place.category,        city: place.city,        state: place.state,        country: place.country,        image: { filename: place.image, mime: 'image/jpeg' },      },    },    { upsert: true, returnOriginal: false }  );};存储和上传:const multer = require('multer');const storage = multer.diskStorage({  destination: function (req, file, cb) {    cb(null, './public/uploads');  },  filename: function (req, file, cb) {    cb(null, Date.now() + '_' + file.originalname);  },});const upload = multer({ storage: storage });Mongo DB 项目现在是这样的:{  "_id": {    "$oid": "5fbc37c4fc13ae680b00001e"  },  "name": "Petronas Towers",  "category": "activity",  "city": "Kuala Lumpur",  "state": "Kuala Lumpur",  "country": "Malaysia",  "image": {    "filename": "petronas.jpg",    "mime": "image/jpeg"  }}
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

GridFS 是一个不错的选择。你得到:

  • 驱动程序自动创建索引,从而实现高效检索

  • 如果您的图像超过 16 MB,则可以灵活处理

  • 独立的元数据和内容存储

您也可以使用二进制类型并将图像数据直接存储在字段中。这会减少开销,但是:

  • 您应该仍然单独存储内容的元数据,或者对该解决方案与内容内联在文档中的解决方案进行基准测试(因为当您只需要元数据时,跳过内容字节可能会很慢)

  • 您需要自己处理元数据


查看完整回答
反对 回复 2023-10-14
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

建议您将较小(小于16MB)的文件作为Buffer类型(即BSON二进制类型)的数据保存到MongoDB中。BSON 二进制类型用于存储任何类型的二进制数据。BSON 二进制类型对应于 RDBMS BLOB 类型,它是 MongoDB 提供的两种二进制对象存储(另一种是 GridFS)的基础。GridFS 是 MongoDB 中的一项规范,它可以通过将给定文件划分为多个块来在 MongoDB 中存储大型文件(例如视频、大型音频文件和图像),这反过来又使我们能够仅获取和加载文件的部分内容,如下所示必需的,而不是检索整个文件。

如果您需要存储的所有文件大小都小于 16 MB,建议您不要使用 GridFS。如果是这种情况,并且您仍然想利用 MongoDB,只需将文件直接存储在普通的 MongoDB 文档中即可。BSON 文档的最大大小为 16 MB,因此如果您的所有文件都较小,那么使用 GridFS 会浪费资源。

但出于教育目的,如果您对小于 16MB 的文件使用 GridFS 并没有什么问题,以上仅适用于生产级别的项目。


查看完整回答
反对 回复 2023-10-14
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信