在没有GridFS的情况下,在NodeJS中使用MongoDB存储一些小(不到1MB)的文件

我运行一个网站,运行在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)一个date,和3)一个图像文件(上面的图标),我想把这个文档发送给客户端显示所有三个,这是可能的? 如果不是,我想我需要使用GridFS并将fileID保存在图像本身的位置。 思考/build议吗?

最好的,谢谢你的回应,
萨米

如果您的图像真的足够小,不会造成文档大小的问题,并且您不介意less量的额外处理,那么将其直接存储在您的collections中可能也不错。 要做到这一点,你需要base64编码图像,然后使用mongo的BinDatatypes进行存储。 据我了解,这将然后将其保存为一个BSON位arrays,而不是实际存储base64string,所以它的大小不会比原来的二进制图像变大。

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

我一直在寻找同样的事情。 我知道这个post很老,但也许我可以帮助那里的人。

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