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

这里的问题和请求相当简单,但尚未找到明确的答案。我是 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"

  }

}


森栏
浏览 121回答 2
2回答

慕标琳琳

GridFS 是一个不错的选择。你得到:驱动程序自动创建索引,从而实现高效检索如果您的图像超过 16 MB,则可以灵活处理独立的元数据和内容存储您也可以使用二进制类型并将图像数据直接存储在字段中。这会减少开销,但是:您应该仍然单独存储内容的元数据,或者对该解决方案与内容内联在文档中的解决方案进行基准测试(因为当您只需要元数据时,跳过内容字节可能会很慢)您需要自己处理元数据

慕妹3146593

建议您将较小(小于16MB)的文件作为Buffer类型(即BSON二进制类型)的数据保存到MongoDB中。BSON 二进制类型用于存储任何类型的二进制数据。BSON 二进制类型对应于 RDBMS BLOB 类型,它是 MongoDB 提供的两种二进制对象存储(另一种是 GridFS)的基础。GridFS 是 MongoDB 中的一项规范,它可以通过将给定文件划分为多个块来在 MongoDB 中存储大型文件(例如视频、大型音频文件和图像),这反过来又使我们能够仅获取和加载文件的部分内容,如下所示必需的,而不是检索整个文件。如果您需要存储的所有文件大小都小于 16 MB,建议您不要使用 GridFS。如果是这种情况,并且您仍然想利用 MongoDB,只需将文件直接存储在普通的 MongoDB 文档中即可。BSON 文档的最大大小为 16 MB,因此如果您的所有文件都较小,那么使用 GridFS 会浪费资源。但出于教育目的,如果您对小于 16MB 的文件使用 GridFS 并没有什么问题,以上仅适用于生产级别的项目。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript