Właśnie zacząłem używać GridFS do zrobienia dokładnie tego, co opisałeś.
Z dotychczasowych doświadczeń wynika, że główną zaletą GridFS jest to, że eliminuje potrzebę oddzielnego systemu przechowywania plików. Nasza cała warstwa trwałości jest już umieszczona w Mongo, więc następnym logicznym krokiem będzie przechowywanie naszego systemu plików również tam. Płaskie spacje nazwiskowe są po prostu kamieniami i pozwalają na bogaty język zapytań do pobierania plików na podstawie dowolnych metadanych, które chcesz do nich dołączyć. W naszej aplikacji użyliśmy obiektu "appdata", który zawierał wszystkie informacje o własności, zapewniające inną rzecz do rozważenia w przypadku przechowywania plików NoSQL, a szczególnie GridFS, jest to, że będzie on odfiltrowany i rozszerzony wraz z innymi danymi. Jeśli cały magazyn DB-klucz przechowujesz w serwerze mongo, to w końcu, jeśli będziesz musiał rozbudować klaster serwerów o więcej maszyn, twój system plików będzie się powiększał wraz z nim.
Może czuć się trochę "czarną skrzynką", ponieważ same dane binarne są podzielone na części, co przeraża te używane do klasycznego systemu plików opartego na katalogach. Jest to łagodzone przy pomocy programów administracyjnych takich jak RockMongo.
W sumie do przechowywania obrazów w GridFS jest tak proste, jak samodzielne wstawianie dokumentów, większość sterowników dla wszystkich głównych języków obsługuje wszystko dla Ciebie. W naszym środowisku pobieraliśmy obrazy w punkcie końcowym i używaliśmy PIL do zmiany rozmiaru. Obrazy zostały następnie pobrane z mongo w innym punkcie końcowym, który właśnie wyprowadził dane i mimetypował je jako jpeg.
Powodzenia!
EDIT:
Aby dać przykład Trivial File przesłać z GridFS, oto najprostsze podejście w PyMongo, biblioteki Pythona.
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!
Można również zapytać przed swoimi wartościami niestandardowymi, jeśli chcesz, które mogą być bardzo przydatne, jeśli chcesz, aby Twoje zapytania opierać się o zamówienie w stosunku do danego zastosowania.
try:
file = fs.get_last_version({'anykey':'foo'})
return file.read()
catch gridfs.errors.NoFile:
return None
To tylko kilka prostych przykładów i sterowniki wiele innych języków (PHP, Ruby, itp) wszystkie mają cognates.
Należy zauważyć, że w aplikacjach, w których ilość plików umieszczanych w systemie jest bardzo wysoka, nie zawsze jest to opcja. Obiekty blob są przechowywane jako pełne pliki i nie są porcjowane, więc wartości wierszy mogą stać się naprawdę duże i sprawić, że kopie zapasowe DB będą wykładniczo większe. Przed skorzystaniem z tej opcji należy zawsze rozważyć kwestie replikacji i wielkość wejściową. – DeaconDesperado