Stockage de quelques petits fichiers (moins de 1MB) avec MongoDB dans NodeJS sans GridFS

je dirige un site web qui fonctionne sur un backend de nodeJS + mongoDB. Maintenant, je suis de mettre en place un système pour stocker certaines icônes (petites images) qui devra être dans la base de données.

d'après ce que j'ai compris, il est plus logique de ne pas utiliser les fichiers grid, car cela semble adapté pour les fichiers volumineux ou pour un grand nombre de fichiers. Puisque chaque fichier que je dois enregistrer sera bien en dessous de la taille maximale du fichier BSON, je devrais être en mesure de les enregistrer directement dans un régulier document.

j'ai 2 questions:

1) mon raisonnement est-il correct? Est-il correct de sauvegarder des fichiers image dans une collection mongo régulière, par opposition à avec GridFS? Y a-t-il quelque chose que je ne considère pas ici que je devrais être?

2) Si ma réflexion est bonne, comment dois-je faire? Puis-je faire quelque chose comme ceci:

//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);
  });
});

je suppose qu'il y a probablement une meilleure façon de faire ceci, puisque mongoDB utilise bson et ici j'essaye de sauvegarder un fichier dans JSON avant de l'Envoyer à la base de données. Je ne sais pas non plus si ce code fonctionnera (Je ne l'ai pas essayé).

mise à jour-nouvelle Question

Si j'ai un document dans une collection qui a trois informations enregistrées: 1) un nom, 2) un jour, et 3) un fichier image (au-dessus de l'icône), et je veux envoyer ce document à un client afin d'afficher toutes les trois, serait-ce possible? Sinon, je suppose que je devrais utiliser GridFS et sauvegarder le fileID à la place de l'image elle-même. Idées/suggestions?

le Meilleur, et merci pour les réponses,

Sami

19
demandé sur thisissami 2012-07-12 02:18:22

2 réponses

si vos images sont vraiment assez petites pour ne pas être un problème avec la taille du document et que vous ne vous souciez pas d'une petite quantité de traitement supplémentaire, alors il est probablement bien de le stocker directement dans votre collection. Pour ce faire, vous voudrez base64 Encoder l'image, puis la stocker en utilisant le type BinData de mongo. Comme je l'ai compris, cela va ensuite l'enregistrer comme un tableau de bits BSON, pas réellement stocker la chaîne base64, de sorte que la taille ne sera pas plus grande que votre image binaire originale.

il s'affichera dans les requêtes json comme une chaîne de base64, que vous pouvez utiliser pour récupérer l'image binaire.

22
répondu Tim Gautier 2012-07-11 22:50:37

je cherchais la même chose. Je sais que ce post est vieux , mais peut-être que je peux aider quelqu'un là-bas.

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

    });
  });
});
4
répondu uajov6 2016-04-25 16:11:53