首页 > 解决方案 > MongoDB 中的小图像(<4MB),我应该使用 gridFS 吗?

问题描述

相当简单的问题和请求在这里,但还没有找到一个确定的答案。我是 multer、Node 和 MongoDB 的新手,这比我预期的要困难得多。

我想在 MongoDB 中存储小的 JPEG,每个可能不超过 4 MB。我知道 BSON 最大可以小于 16 MB,如果更大,则必须由 gridfs 处理。

这些图像只是我在收藏中拥有的每个 _id 的个人资料照片。到目前为止,我已经能够仅使用 multer 在本地上传文件。现在我想弄清楚如何在 MongoDB 中以正确的方式获取这些图像。

这么小的图像我需要gridfs吗?我执行此操作的最佳计划是什么?

我正在想象将文件更新插入数据库,但想知道这是否只会上传文件名而不是图像本身?我将如何更改我的“模式”以适应这种情况?如果您知道如何在下面更改我的 upsert(与进入 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"
  }
}

标签: javascriptmongodbmultergridfsmulter-gridfs-storage

解决方案


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

  • 驱动程序自动创建索引,从而高效检索
  • 如果您的图像超过 16 mb,则具有灵活性
  • 独立的元数据和内容存储

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

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

推荐阅读