【问题标题】:Storing some small (under 1MB) files with MongoDB in NodeJS WITHOUT GridFS在没有 GridFS 的 NodeJS 中使用 MongoDB 存储一些小(小于 1MB)文件
【发布时间】:2012-07-11 15:27:03
【问题描述】:

我运行一个在 nodeJS + mongoDB 后端运行的网站。现在,我正在实现一个系统来存储一些需要在数据库中的图标(小图像文件)。

据我了解,不使用 GridFS 更有意义,因为它似乎是为大文件或大量文件量身定制的。由于我需要保存的每个文件都将远低于 BSON 最大文件大小,因此我应该能够将它们直接保存到常规文档中。

我有两个问题:

1) 我的推理正确吗?可以将图像文件保存在常规的 mongo 集合中,而不是使用 GridFS 吗?有什么我不应该考虑的吗?

2) 如果我的思维过程是健全的,我该怎么做呢?我可以执行以下操作吗:

//assume 'things' is a mongoDB collection created properly using node-mongodb-driver

fs.readFile(pathToIconImage, function(err,image){
  things.insert({'image':image}, function(err,doc){
    if(err) console.log('you have an error! ' + err);
  });
});

我猜可能有更好的方法来做到这一点,因为 mongoDB 使用 BSON,在这里我试图在将文件发送到数据库之前将其保存为 JSON。我也不知道这段代码是否有效(没试过)。

更新 - 新问题

如果我在集合中有一个文档,其中保存了三条信息:1) 名称、2) 日期和 3) 图像文件(上面的图标),并且我想将此文档发送到客户端为了显示所有三个,这可能吗?如果没有,我想我需要使用 GridFS 并保存 fileID 来代替图像本身。想法/建议?

最好,感谢您的任何回复,
萨米

【问题讨论】:

  • “量身定制”没有任何意义。量身定制如何?使用 GridFS 执行此任务会出现什么问题?
  • 我想我会按照这里的建议进行操作:mongodb.org/display/DOCS/When+to+use+GridFS
  • 那里列出的任何案例是否真的适用于您?
  • 我正在查看目前适用于我但将来不会使用的“少数小型静态文件”(何时不使用它)。我想你是对的。从长远来看,使用 GridFS 可能会更容易。但话虽如此,我仍然很好奇如何在没有网格系统的情况下将一个小文件放入 MongoDB。
  • GridFS 只是数据库中的两个 MongoDB 集合——一个用于文件元数据,一个用于文件的“块”(每个块为 1/4 MB)。

标签: node.js mongodb gridfs


【解决方案1】:

如果您的图像确实足够小,不会成为文档大小的问题,并且您不介意进行少量额外处理,那么将其直接存储在您的收藏中可能就可以了。为此,您需要对图像进行 base64 编码,然后使用 mongo 的 BinData 类型存储它。据我了解,这会将其保存为 BSON 位数组,而不是实际存储 base64 字符串,因此大小不会比原始二进制图像大。

它将在 json 查询中显示为 base64 字符串,您可以使用它来获取二进制图像。

【讨论】:

  • 我最终使用了 GridFS,但对于希望将图像直接存储为文档的任何人来说,这似乎是正确的方法。
  • 不——我在过去 2 个月内第一次使用猫鼬。前 3 年使用 mongodb nodejs 原生驱动。
【解决方案2】:

我一直在寻找同样的东西。 我知道这篇文章很旧,但也许我可以帮助那里的人。

var fs = require('fs');
var mongo = require('mongodb').MongoClient;
var Binary = require('mongodb').Binary;

var archivobin = fs.readFileSync("vc.exe"); 
// print it out so you can check that the file is loaded correctly
console.log("Loading file");
console.log(archivobin);

var invoice = {};
invoice.bin = Binary(archivobin);

console.log("largo de invoice.bin= "+ invoice.bin.length());
// set an ID for the document for easy retrieval
invoice._id = 12345; 
  mongo.connect('mongodb://localhost:27017/nogrid', function(err, db) {
  if(err) console.log(err);
     db.collection('invoices').insert(invoice, function(err, doc){
    if(err) console.log(err);
  // check the inserted document
    console.log("Inserting file");
    console.log(doc);

    db.collection('invoices').findOne({_id : 12345}, function(err, doc){
      if (err) {
        console.error(err);
        }

      fs.writeFile('vcout.exe', doc.bin.buffer, function(err){
          if (err) throw err;
          console.log('Sucessfully saved!');
    });

    });
  });
});

【讨论】:

  • 有帮助 +1。如果您可以展示如何保存多个文件(例如,使用 multer 上传,则需要多次调用 readFileSync 或 readFile 时会更有帮助。
  • 这已经很老了,但非常感谢 +1。我是 mongodb 的新手,那里的每个指南都在使用 express(我不想使用它,因为我正在使用 Next.js 并且只想使用 api 路由)和 gridFS。我能够将您的示例完美地改编为我想做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2013-10-27
  • 2013-05-12
  • 2016-04-05
  • 2016-03-26
  • 2018-01-01
  • 2015-04-06
相关资源
最近更新 更多