javascript - 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"
}
}
解决方案
GridFS 不是一个糟糕的选择。你得到:
- 驱动程序自动创建索引,从而高效检索
- 如果您的图像超过 16 mb,则具有灵活性
- 独立的元数据和内容存储
您也可以使用二进制类型并将图像数据直接存储在字段中。这将减少开销,但是:
- 您应该仍然为内容单独存储元数据,或者将该解决方案与文档中内联内容的解决方案进行基准测试(因为当您只需要元数据时,跳过内容字节可能会很慢)
- 您需要自己处理元数据
推荐阅读
- python-2.7 - pandas 创建多个聚合而不使用 multiindex
- spring - 如何从自定义源加载 Spring Boot 中的属性?
- bash - 使用分隔符循环字符串(键,值) - Bash 脚本
- git - make 命令构建 vivado 项目后出错
- rust - 是否可以在纯 Rust 宏中编写像 `print!` 这样复杂的东西?
- c - “字符串”声明的 gcc 数组失败
- javascript - 错误:无法在“节点”上执行“appendChild”:文档上只允许一个元素
- ios - SpriteKit Swift:SKView 返回 nil
- asp.net-web-api - Web API Post Type 操作没有被 jquery ajax 调用
- python - 简单标题的 Django 匹配 URL