【问题标题】:Small images (<4MB) in MongoDB, should I use gridFS?MongoDB 中的小图像(<4MB),我应该使用 gridFS 吗?
【发布时间】:2020-12-06 02:39:48
【问题描述】:

这里比较简单的问题和请求,但还没有找到确切的答案。我是 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"
  }
}

【问题讨论】:

    标签: javascript mongodb multer gridfs multer-gridfs-storage


    【解决方案1】:

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

    • 驱动程序自动创建索引,从而实现高效检索
    • 图片大小超过 16 mb 时的灵活性
    • 独立的元数据和内容存储

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

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

    【讨论】:

    • 谢谢,D. SM。到目前为止,我还没有找到我能够遵循的 GridFS 教程。我在任何这些教程中都没有看到上传的图像如何与特定记录相关联,以及我以后如何通过数据库查询找到({})它。我觉得 GridFS 是最好的,但我时间紧迫。使用 Grid FS,我认为图像将通过带有 upsert 的 findOneAndUpdate() 放入数据库中:是的,我不知道如何以其他方式完成。我希望我解释得很好。你有什么特别适合新手的教程吗?
    • 对于我正在做的事情,我正在使用 node.js/express/handlebars/oboe。这还会有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2011-12-10
    • 2013-09-15
    • 2013-03-14
    • 1970-01-01
    • 2012-02-06
    • 2014-05-11
    相关资源
    最近更新 更多