web-dev-qa-db-ja.com

GridFSなしでNodeJSにMongoDBでいくつかの小さな(1MB未満)ファイルを保存する

NodeJS + mongoDBのバックエンドで実行されるWebサイトを実行しています。現在、データベースに必要ないくつかのアイコン(小さな画像ファイル)を保存するシステムを実装しています。

私の理解では、GridFSを使用しない方が理にかなっています。これは、大きなファイルまたは多数のファイルのいずれかに合わせて調整されているように見えるためです。保存する必要のあるすべてのファイルはBSONの最大ファイルサイズよりもかなり小さいため、通常のドキュメントに直接保存できるはずです。

2つの質問があります。

1)私の推論は正しいですか? GridFSとは対照的に、通常のmongoコレクション内に画像ファイルを保存しても問題ありませんか?ここで考えていないことはありますか?

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で保存しようとしているため、これを行うにはもっと良い方法があると思います。このコードが機能するかどうかもわかりません(試していません)。

更新-新しい質問

コレクション内に3つの情報が保存されているドキュメントがある場合:1)名前、2)日付、3)画像ファイル(上のアイコン)、このドキュメントを順番にクライアントに送信する場合3つすべてを表示するには、これは可能でしょうか?そうでない場合は、GridFSを使用して、画像自体の代わりにfileIDを保存する必要があると思います。考え/提案?

よろしくお願い申し上げます。
サーミ

25
thisissami

画像が本当に小さく、ドキュメントのサイズに問題がなく、少し余分な処理を気にしない場合は、コレクションに直接保存するだけで問題ありません。これを行うには、画像をbase64エンコードし、mongoのBinDataタイプを使用して保存します。私が理解しているように、これはそれをBSONビット配列として保存し、実際にはbase64文字列を格納しないため、サイズが元のバイナリイメージより大きくなることはありません。

Jsonクエリでは、base64文字列として表示されます。これを使用して、バイナリイメージを取得できます。

26
Tim Gautier

同じものを探していました。私はこの投稿が古いことを知っていますが、おそらく誰かを助けることができます。

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!');
    });

    });
  });
});
9
uajov6