Acabo de empezar a usar GridFS para hacer exactamente lo que describió.
Desde mi experiencia hasta ahora, la principal ventaja de GridFS es que evita la necesidad de un sistema de almacenamiento de archivos por separado. Toda nuestra capa de persistencia ya está en Mongo, por lo que el próximo paso lógico sería almacenar nuestro sistema de archivos allí también. El espacio de nombres plano simplemente oscila y le permite un lenguaje de consulta enriquecido para recuperar sus archivos en función de los metadatos que quiera adjuntar a ellos. En nuestra aplicación utilizamos un objeto 'appdata' que incluía toda la información de propiedad, asegure
Otra cosa a considerar con el almacenamiento de archivos NoSQL, y especialmente GridFS, es que se fragmentará y expandirá junto con sus otros datos. Si tiene todo su almacén de valores-clave de BD dentro del servidor mongo, eventualmente, si alguna vez tiene que expandir su clúster de servidores con más máquinas, su sistema de archivos crecerá junto con él.
Puede sentir una pequeña "caja negra" ya que los datos binarios en sí se dividen en fragmentos, un prospecto que asusta a los que se usan para un sistema de archivos basado en un directorio clásico. Esto se alivia con la ayuda de programas de administración como RockMongo.
En general, para almacenar imágenes en GridFS es tan fácil como insertar los documentos, la mayoría de los controladores para todos los idiomas principales manejan todo para usted. En nuestro entorno, tomamos cargas de imágenes en un punto final y usamos PIL para realizar cambios de tamaño. Luego, las imágenes se obtuvieron de mongo en otro punto final que solo daba salida a los datos y lo mimetizaba como un jpeg.
¡La mejor de las suertes!
EDITAR:
Para darles un ejemplo de un archivo trivial cargar con GridFS, aquí está el enfoque más simple en PyMongo, la biblioteca de Python.
from pymongo import Connection
import gridfs
binary_data = 'Hello, world!'
db = Connection().test_db
fs = gridfs.GridFS(db)
#the filename kwarg sets the filename in the mongo doc, but you can pass anything in
#and make custom key-values too.
file_id = fs.put(binary_data, filename='helloworld.txt',anykey="foo")
output = fs.get(file_id).read()
print output
>>>Hello, world!
También se puede consultar en contra de sus valores personalizados si se quiere, que puede ser muy útil si desea que sus consultas a estar basados fuera de la información personalizada relativa a su aplicación.
try:
file = fs.get_last_version({'anykey':'foo'})
return file.read()
catch gridfs.errors.NoFile:
return None
Estos son sólo algunos ejemplos sencillos, y los controladores para muchos de los otros idiomas (PHP, Ruby, etc.) todos tienen cognados.
Cabe señalar que en aplicaciones donde el volumen de archivos que se ingresan al sistema es muy alto, esto no siempre es una opción. Los blobs se almacenan como archivos completos y no fragmentados, por lo que los valores de las filas pueden ser realmente grandes y hacer copias de seguridad de bases de datos exponencialmente más grandes. Uno siempre debe considerar las consideraciones de replicación y el volumen de entrada antes de ir con esta opción. – DeaconDesperado