tutorial nodejs node mongodriver node.js mongodb gridfs

node.js - mongodriver - require mongodb nodejs



Almacenar algunos archivos pequeños(menos de 1 MB) con MongoDB en NodeJS SIN GRIDFS (2)

Ejecuto un sitio web que se ejecuta en un backend de nodeJS + mongoDB. En este momento, estoy implementando un sistema para almacenar algunos íconos (archivos de imágenes pequeñas) que deberán estar en la base de datos.

Desde mi punto de vista, tiene más sentido NO usar GridFS, ya que parece estar hecho a medida para archivos grandes o grandes cantidades de archivos. Dado que cada archivo que necesito guardar estará bien por debajo del tamaño máximo de archivo de BSON, debería poder guardarlos directamente en un documento normal.

Tengo 2 preguntas:

1) ¿Mi razonamiento es correcto? ¿Es correcto guardar archivos de imagen dentro de una colección de Mongo regular, en lugar de con GridFS? ¿Hay algo que no esté considerando aquí que debería ser?

2) Si mi proceso de pensamiento es correcto, ¿cómo hago para hacer esto? ¿Podría hacer algo como lo siguiente?

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

Supongo que probablemente hay una mejor manera de hacerlo, ya que mongoDB usa BSON y aquí estoy tratando de guardar un archivo en JSON antes de enviarlo a la base de datos. Tampoco sé si este código funcionará (no lo he probado).

ACTUALIZACIÓN - Nueva pregunta

Si tengo un documento dentro de una colección que tiene tres datos guardados: 1) un nombre, 2) una fecha y 3) un archivo de imagen (el ícono de arriba), y deseo enviar este documento a un cliente en orden para mostrar los tres, ¿sería esto posible? Si no, creo que necesitaría usar GridFS y guardar el ID de archivo en lugar de la imagen en sí. ¿Pensamientos / sugerencias?

Mejor, y gracias por cualquier respuesta,
Sami


He estado buscando lo mismo. Sé que esta publicación es antigua, pero tal vez pueda ayudar a alguien.

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


Si sus imágenes son lo suficientemente pequeñas como para no ser un problema con el tamaño del documento y no le importa un poco de procesamiento adicional, es probable que esté bien simplemente almacenarlo directamente en su colección. Para hacerlo, querrá codificar en base64 la imagen, luego almacenarla utilizando el tipo BinData de mongo. Como lo entiendo, eso lo guardará como una matriz de bits BSON, en realidad no almacenará la cadena base64, por lo que el tamaño no crecerá más que su imagen binaria original.

Se mostrará en las consultas json como una cadena base64, que puede utilizar para recuperar la imagen binaria.