Только что начал использовать GridFS, чтобы делать именно то, что вы описали.
Исходя из моего опыта, главным преимуществом GridFS является то, что он устраняет необходимость в отдельной системе хранения файлов. Весь наш уровень персистентности уже добавлен в Mongo, и поэтому следующим логическим шагом будет также сохранение нашей файловой системы. Простое пространство имен просто потрясающе и позволяет вам использовать богатый язык запросов для извлечения файлов на основе любых метаданных, которые вы хотите прикрепить к ним. В нашем приложении мы использовали объект 'appdata', в который была встроена вся информация о владельце.
Еще одна вещь, которую следует учитывать при хранении файлов в NoSQL, особенно в GridFS, - это то, что оно будет фрагментироваться и расширяться вместе с другими вашими данными. Если у вас есть все хранилище значений ключей БД на сервере Монго, то в конечном итоге, если вам когда-нибудь понадобится расширить кластер серверов с помощью большего количества компьютеров, ваша файловая система будет расти вместе с ней.
Это может показаться небольшим «черным ящиком», так как сами двоичные данные разбиты на куски, перспектива, которая пугает те, которые используются в классической файловой системе на основе каталогов. Это облегчается с помощью программ администратора, таких как RockMongo.
В общем, хранить изображения в GridFS так же просто, как вставлять сами документы, большинство драйверов для всех основных языков обрабатывают все за вас. В нашей среде мы загружали изображения в конечную точку и использовали PIL для изменения размера. Затем изображения извлекались из Монго в другой конечной точке, которая просто выводила данные, и имитировала их в формате JPEG.
Удачи!
EDIT
Чтобы дать вам пример простой загрузки файла с помощью GridFS, вот самый простой подход к PyMongo, библиотеке 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!
Вы также можете запросить свои пользовательские значения, если хотите, что может быть ДЕЙСТВИТЕЛЬНО полезно, если вы хотите, чтобы ваши запросы основывались на пользовательской информации, относящейся к вашему приложению.
try:
file = fs.get_last_version({'anykey':'foo'})
return file.read()
catch gridfs.errors.NoFile:
return None
Это всего лишь несколько простых примеров, и драйверы для многих других языков (PHP, Ruby и т. Д.) Имеют родственников.