Хранение небольших (до 1 МБ) файлов с MongoDB в NodeJS БЕЗ GridFS

Я запускаю веб-сайт, который работает на сервере nodeJS + mongoDB. Прямо сейчас я реализую систему для хранения некоторых значков (небольших файлов изображений), которые должны быть в базе данных.

С моей точки зрения, больше смысла НЕ использовать GridFS, поскольку это, похоже, предназначено для больших файлов или большого количества файлов. Поскольку каждый файл, который мне нужно сохранить, будет соответствовать максимальному размеру файла BSON, я должен иметь возможность сохранять их непосредственно в обычный документ.

У меня есть 2 вопроса:

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 и сохранить файлID вместо самого изображения. Мысли/предложения?

Лучший, и спасибо за любые ответы,
Sami

Ответ 1

Если ваши изображения действительно достаточно малы, чтобы не быть проблемой с размером документа, и вы не возражаете против небольшого количества дополнительной обработки, то, вероятно, это просто просто сохранить его прямо в вашей коллекции. Для этого вы хотите, чтобы base64 закодировал изображение, а затем сохраните его, используя тип mongo BinData. Как я понимаю, это сохранит его как бит-бит BSON, на самом деле не сохранит строку base64, поэтому размер не будет больше, чем исходное двоичное изображение.

Он будет отображаться в json-запросах в виде строки base64, которую вы можете использовать для возврата двоичного изображения.

Ответ 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!');
    });

    });
  });
});