MongoDB - GridFS: Hướng dẫn cơ bản cho người mới bắt đầu lưu trữ các tệp lớn

Xin chào, các bạn lập trình viên đang học hỏi! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của MongoDB và tính năng mạnh mẽ của nó, GridFS. Đừng lo lắng nếu bạn là người mới bắt đầu lập trình - tôi sẽ là hướng dẫn viên thân thiện của bạn, giải thích mọi thứ từng bước. Hãy cùng nhau nhảy vào!

MongoDB - GridFS

GridFS là gì và tại sao bạn nên quan tâm?

Hãy tưởng tượng bạn đang tổ chức một thư viện khổng lồ. Bạn có sách của mọi kích thước - một số là sách nhỏ, một số là sách bách khoa cỡ lớn. Bây giờ, nếu bạn phải lưu trữ một cuộn lớn quá lớn để đặt lên bất kỳ kệ nào? Đó là lúc GridFS phát huy tác dụng trong thế giới cơ sở dữ liệu.

GridFS là giải pháp của MongoDB để lưu trữ và truy xuất các tệp lớn như ảnh, tệp audio hoặc video. Nó giống như có một căn phòng đặc biệt trong thư viện của chúng ta cho những vật phẩm quá lớn.

Phép màu đằng sau GridFS

GridFS hoạt động bằng cách chia các tệp lớn thành các khúc nhỏ hơn. Hãy tưởng tượng như cắt cuộn dài thành các mảnh quản lý được. Mỗi khúc có kích thước mặc định là 255KB (khoảng kích thước của một cuốn sách điện tử ngắn). Các khúc này sau đó được lưu trữ dưới dạng các tài liệu riêng lẻ trong hai bộ sưu tập:

  1. fs.files: Lưu trữ metadata về tệp (như tên, kích thước, v.v.)
  2. fs.chunks: Lưu trữ nội dung thực tế của tệp thành các mảnh

Bắt đầu với GridFS

Trước khi chúng ta bắt đầu thêm tệp vào GridFS, chúng ta cần thiết lập môi trường MongoDB của mình. Đừng lo lắng; tôi sẽ hướng dẫn bạn!

Bước 1: Cài đặt MongoDB

Trước tiên, tải xuống và cài đặt MongoDB từ trang web chính thức. Điều này giống như thiết lập tòa nhà thư viện của chúng ta trước khi chúng ta có thể bắt đầu lưu trữ sách.

Bước 2: Cài đặt bộ điều khiển MongoDB

Chúng ta sẽ sử dụng Python để tương tác với MongoDB. Cài đặt bộ điều khiển PyMongo bằng cách sử dụng pip:

pip install pymongo

Điều này giống như thuê một thư viện viên biết cả Python và ngôn ngữ MongoDB!

Thêm tệp vào GridFS

Bây giờ chúng ta đã thiết lập thư viện của mình, hãy bắt đầu thêm một số sách - hoặc trong trường hợp của chúng ta, là các tệp!

Tải lên tệp cơ bản

Dưới đây là một đoạn mã đơn giản để tải lên một tệp vào GridFS:

from pymongo import MongoClient
import gridfs

# Kết nối đến MongoDB
client = MongoClient('mongodb://localhost:27017')
db = client['mydatabase']

# Tạo instance GridFS
fs = gridfs.GridFS(db)

# Mở và đọc tệp
with open('my_image.jpg', 'rb') as f:
contents = f.read()

# Lưu tệp vào GridFS
file_id = fs.put(contents, filename='my_image.jpg')

print(f"Tệp đã được tải lên với id: {file_id}")

Hãy phân tích này:

  1. Chúng ta import các thư viện cần thiết và kết nối đến cơ sở dữ liệu MongoDB của chúng ta.
  2. Chúng ta tạo một instance GridFS, giống như mở cửa vào phòng lưu trữ đặc biệt của chúng ta.
  3. Chúng ta mở và đọc tệp ('my_image.jpg' trong trường hợp này).
  4. Chúng ta sử dụng fs.put() để lưu tệp vào GridFS. Hàm này trả về một ID duy nhất cho tệp của chúng ta.

Thêm metadata

Đôi khi, chúng ta muốn thêm thông tin chi tiết về tệp của mình. Điều này giống như thêm một thẻ mô tả chi tiết cho sách trong thư viện. Dưới đây là cách chúng ta có thể làm điều đó:

file_id = fs.put(contents,
filename='my_image.jpg',
content_type='image/jpeg',
author='Jane Doe',
date_taken='2023-06-15')

Trong ví dụ này, chúng ta thêm thông tin bổ sung như loại nội dung, tác giả và ngày chụp ảnh.

Tải lên tệp lớn thành các khúc

Nhớ lại khi tôi nói GridFS chia tệp thành các khúc? Chúng ta có thể làm điều này thủ công cho các tệp rất lớn để tránh vấn đề bộ nhớ:

def upload_large_file(filepath, chunk_size=255*1024):
with open(filepath, 'rb') as f:
filename = filepath.split('/')[-1]
file_id = fs.new_file(filename=filename)

while True:
chunk = f.read(chunk_size)
if not chunk:
break
file_id.write(chunk)

file_id.close()
return file_id._id

large_file_id = upload_large_file('very_large_video.mp4')
print(f"Tệp lớn đã được tải lên với id: {large_file_id}")

Hàm này đọc tệp theo từng khúc và ghi từng khúc vào GridFS. Điều này giống như cẩn thận sao chép cuộn lớn từng mảnh.

Truy xuất tệp từ GridFS

Bây giờ chúng ta đã thêm tệp, hãy học cách truy xuất chúng:

# Truy xuất tệp theo ID
file_data = fs.get(file_id).read()

# Lưu tệp
with open('retrieved_image.jpg', 'wb') as f:
f.write(file_data)

print("Tệp đã được truy xuất và lưu!")

Đoạn mã này lấy tệp từ GridFS và lưu nó vào máy tính của chúng ta. Điều này giống như mượn một cuốn sách từ phòng lưu trữ đặc biệt của chúng ta!

Liệt kê tất cả các tệp trong GridFS

Đôi khi, chúng ta muốn xem tất cả các tệp chúng ta đã lưu trữ. Dưới đây là cách chúng ta có thể làm điều đó:

for grid_file in fs.find():
print(f"Tên tệp: {grid_file.filename}, Kích thước: {grid_file.length} byte")

Điều này sẽ in ra danh sách tất cả các tệp trong GridFS, cùng với kích thước của chúng. Điều này giống như lấy danh mục tất cả các vật phẩm đặc biệt trong thư viện của chúng ta!

Xóa tệp khỏi GridFS

Cuối cùng, hãy học cách xóa tệp:

fs.delete(file_id)
print(f"Tệp với id {file_id} đã bị xóa.")

Điều này xóa tệp có ID xác định khỏi GridFS. Lưu ý, một khi đã xóa, nó sẽ không thể khôi phục!

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới của MongoDB's GridFS. Chúng ta đã học cách lưu trữ, truy xuất, liệt kê và xóa các tệp lớn. Nhớ rằng, GridFS là một công cụ mạnh mẽ cho việc xử lý dữ liệu lớn, và với sự luyện tập, bạn sẽ trở thành một thư viện viên thành thạo trong thế giới số!

Dưới đây là bảng tóm tắt các phương thức GridFS chính mà chúng ta đã xem xét:

Phương thức Mô tả
fs.put() Lưu một tệp mới vào GridFS
fs.get() Truy xuất một tệp từ GridFS
fs.find() Liệt kê tất cả các tệp trong GridFS
fs.delete() Xóa một tệp khỏi GridFS

Tiếp tục luyện tập, 保持好奇心 (giữ vững sự tò mò) và chúc bạn lập trình vui vẻ! Nhớ rằng, mỗi chuyên gia từng là người mới bắt đầu, vì vậy đừng sợ thử nghiệm và học hỏi từ những sai lầm của bạn. Bạn đang trên con đường trở thành một chuyên gia MongoDB GridFS!

Credits: Image by storyset