Chỉ mới bắt đầu sử dụng GridFS để thực hiện chính xác những gì bạn mô tả.
Từ kinh nghiệm của tôi cho đến nay, lợi thế chính của GridFS là nó giảm bớt sự cần thiết cho một hệ thống lưu trữ tệp riêng biệt. Toàn bộ lớp persistency của chúng ta đã được đưa vào Mongo, và vì vậy bước hợp lý tiếp theo sẽ là lưu trữ hệ thống tập tin của chúng ta ở đó. Các căn hộ không gian tên chỉ đá và cho phép bạn một ngôn ngữ truy vấn phong phú để lấy các tập tin của bạn dựa trên bất cứ điều gì siêu dữ liệu bạn muốn đính kèm vào chúng. Trong ứng dụng của chúng tôi, chúng tôi đã sử dụng đối tượng 'appdata' để nhúng tất cả thông tin về quyền sở hữu, đảm bảo
Một điều cần xem xét với lưu trữ tệp NoSQL và đặc biệt là GridFS, là nó sẽ phân chia và mở rộng cùng với dữ liệu khác của bạn. Nếu bạn đã có toàn bộ kho khóa-giá trị DB bên trong máy chủ mongo, thì cuối cùng nếu bạn phải mở rộng cụm máy chủ của mình với nhiều máy hơn, hệ thống tệp của bạn sẽ phát triển cùng với nó.
Nó có thể cảm thấy một 'hộp đen' nhỏ vì dữ liệu nhị phân được chia thành nhiều phần, một viễn cảnh làm cho những người sử dụng hệ thống tập tin dựa trên thư mục kinh điển sợ hãi. Điều này được giảm bớt với sự trợ giúp của các chương trình quản trị như RockMongo.
Tất cả trong tất cả để lưu trữ hình ảnh trong GridFS dễ dàng như chèn tài liệu, hầu hết các trình điều khiển cho tất cả các ngôn ngữ chính xử lý mọi thứ cho bạn. Trong môi trường của chúng tôi, chúng tôi đã tải lên hình ảnh tại điểm cuối và sử dụng PIL để thực hiện thay đổi kích thước. Các hình ảnh sau đó được lấy từ mongo tại một điểm cuối khác mà chỉ xuất dữ liệu và bắt chước nó dưới dạng jpeg.
Chúc bạn may mắn!
EDIT:
Để cung cấp cho bạn một ví dụ của một tập tin tầm thường tải lên với GridFS, đây là phương pháp đơn giản nhất trong PyMongo, thư viện 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!
Bạn cũng có thể truy vấn giá trị tùy chỉnh nếu muốn, điều này có thể hữu ích nếu bạn muốn truy vấn dựa trên thông tin tùy chỉnh liên quan đến ứng dụng của bạn.
try:
file = fs.get_last_version({'anykey':'foo'})
return file.read()
catch gridfs.errors.NoFile:
return None
Đây chỉ là một số ví dụ đơn giản và trình điều khiển cho nhiều ngôn ngữ khác (PHP, Ruby, v.v.) đều có cùng nguồn gốc.
Cần lưu ý rằng trong các ứng dụng có khối lượng tệp được đưa vào hệ thống rất cao, đây không phải lúc nào cũng là một tùy chọn. Các đốm màu được lưu trữ dưới dạng tập tin đầy đủ và không được chunked, do đó, các giá trị hàng có thể nhận được thực sự lớn và làm cho DB sao lưu theo cấp số nhân lớn hơn. Một trong những nên luôn luôn xem xét nhân rộng cân nhắc và khối lượng đầu vào trước khi đi với tùy chọn này. – DeaconDesperado