MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Lưu trữ tệp trong MongoDB với GridFS

Nhiều ứng dụng liên quan đến quản lý tệp và lưu trữ tệp như một tính năng quan trọng để tăng cường xử lý dữ liệu. Việc lưu trữ tệp thường yêu cầu CDN (Mạng phân phối nội dung) của bên thứ ba, chẳng hạn như các dịch vụ Web của Amazon, nhưng điều này làm cho quá trình quản lý hơi tẻ nhạt. Sẽ dễ dàng hơn để truy cập tất cả các tài nguyên của bạn từ một bộ lưu trữ đám mây duy nhất, thay vì nhiều bộ nhớ, vì có thể có khả năng bị lỗi trong quá trình truy xuất.

Lưu trữ tệp trực tiếp vào cơ sở dữ liệu thông qua một lệnh gọi API không phải là điều dễ dàng thực hiện cho đến khi giới thiệu GridFS trong MongoDB.

MongoDB GridFS là gì

GridFs là một lớp trừu tượng trong MongoDB được sử dụng để lưu trữ và khôi phục các tệp lớn như video, âm thanh và hình ảnh. Hệ thống tệp này lưu trữ các tệp có dung lượng lớn hơn 16 MB trong bộ sưu tập dữ liệu MongoDB. Các tệp được lưu trữ bằng cách chia nhỏ nó thành các phần dữ liệu nhỏ hơn, mỗi phần có kích thước 255 KB.

GridFS sử dụng hai hệ thống thu thập để lưu trữ tệp:

  1. Chunk :Đây là bộ sưu tập lưu trữ các phần tài liệu. Các phần được giới hạn ở kích thước 255KB mỗi phần và khi một người thực hiện truy vấn, trình điều khiển GridFS sẽ tập hợp lại tất cả các phần theo _id lưu trữ duy nhất. Ví dụ:bạn có thể muốn truy xuất một phân đoạn của tệp video thay vì toàn bộ tệp, điều này có thể thực hiện được bằng cách chỉ cần truy vấn phạm vi chính xác mà bạn muốn.
  2. Tệp :Điều này lưu trữ siêu dữ liệu bổ sung do đó cho tệp.

Các tập hợp được đặt trong một nhóm chung và sau đó đặt tiền tố cho mỗi nhóm bằng tên nhóm theo mặc định là fs và do đó chúng ta có:

  • fs.chunks
  • fs.files

Người ta có thể chọn một tên nhóm khác nhưng tên bộ sưu tập đầy đủ phải tuân theo:giới hạn không gian tên là 255 byte.

Bộ sưu tập chun

Tài liệu thu thập phân đoạn có dạng:

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Trong đó:

  • _id:là số nhận dạng duy nhất cho đoạn này
  • files_id:là _id của tài liệu mẹ được lưu trữ trong bộ sưu tập tệp
  • n:là số thứ tự của đoạn bắt đầu bằng 0.
  • data:là trọng tải của chunk ở dạng BSON Binary.

Một chỉ mục kết hợp sử dụng các trường files_id và n được sử dụng để cho phép truy xuất các phần hiệu quả, ví dụ:

db.fs.chunks.find( { files_id: fileId } ).sort( { n: 1 } )

Để tạo chỉ mục này nếu nó không tồn tại, bạn có thể chạy lệnh sau trên trình bao mongo:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

Bộ sưu tập Tệp

Các tài liệu trong bộ sưu tập này có dạng

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Trong đó:

  • _id:là mã định danh duy nhất cho tài liệu thuộc loại dữ liệu mà người ta chọn cho tài liệu gốc và theo mặc định trong MongoDB là BSON ObjectId.
  • length:là kích thước của tài liệu tính bằng byte
  • chunkSize:kích thước của mỗi đoạn được giới hạn ở 255 kilobyte
  • uploadDate:trường loại Ngày lưu trữ ngày tài liệu được lưu trữ lần đầu tiên.
  • tên tệp:đây là trường tùy chọn là trường nhận dạng có thể đọc được của con người đối với tệp.
  • siêu dữ liệu:đây là trường tùy chọn chứa thông tin bổ sung mà người ta muốn lưu trữ.

Ví dụ về tệp fs được hiển thị bên dưới.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

   "uploadDate": ISODate("2020-08-11T10:02:15.237Z"),

   "length": NumberInt(312)

}

Giống như bộ sưu tập khối, một chỉ mục kết hợp sử dụng trường tên tệp và ngày tải lên được sử dụng trong bộ sưu tập tệp để cho phép truy xuất tệp hiệu quả, ví dụ:

db.fs.files.find( { filename: fileName } ).sort( { uploadDate: 1 } )

Để tạo chỉ mục này nếu nó không tồn tại, bạn có thể chạy lệnh sau trên trình bao mongo:

db.fs.file.createIndex( { filename: 1, uploadDate: 1 }, { unique: true } );

Khi nào sử dụng Hệ thống lưu trữ MongoDB GridFS

MongoDB GridFS không được sử dụng phổ biến nhưng sau đây là các điều kiện cần thiết để sử dụng hệ thống lưu trữ GridFS này;

  • Khi hệ thống tệp hiện tại có giới hạn về số lượng tệp có thể được lưu trữ trong một thư mục nhất định.
  • Khi một người có ý định truy cập một phần thông tin được lưu trữ, GridFS cho phép một người gọi lại các phần của tệp mà không cần truy cập toàn bộ tài liệu.
  • Khi có ý định phân phối tệp và siêu dữ liệu của chúng thông qua các tập hợp bản sao được phân phối theo địa lý, GridFS cho phép siêu dữ liệu tự động đồng bộ hóa và triển khai dữ liệu trên nhiều hệ thống được nhắm mục tiêu.

Khi nào không sử dụng Hệ thống lưu trữ MongoDB GridFS

Tuy nhiên, hệ thống lưu trữ GridFS không thích hợp để sử dụng khi cần cập nhật nội dung của toàn bộ tệp được lưu trong GridFS.

Cách Thêm Tệp vào GridFS

Khi lưu trữ tệp mp3 trong MongoDB bằng GridFs, quy trình phù hợp cần tuân theo là sau;

  1. Mở terminal (Dấu nhắc lệnh)
  2. Điều hướng đến mongofiles.exe (tệp này nằm trong thư mục bin)
  3. Sử dụng lệnh
    >mongofiles.exe -d gridfs put song.mp3

Sau lệnh, tên của cơ sở dữ liệu sẽ được sử dụng là gridfs, nếu tình cờ, tên bị thiếu, MongoDB sẽ tự động tạo một tài liệu lưu trữ tệp trên cơ sở dữ liệu.

Để xem tệp được lưu trữ trong GridFS, hãy sử dụng lệnh truy vấn bên dưới trên mongo shell;

>db.fs.files.find()

Lệnh trả về tài liệu có định dạng được hiển thị bên dưới:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",

   length: 10302960

}

Tệp có các chi tiết sau, tên tệp, độ dài, ngày tải lên, kích thước chunk và object_id. Các phần trong bộ sưu tập fs.chunks có thể được xem bằng cách sử dụng id được trả về trong truy vấn ban đầu như được hiển thị bên dưới.

>db.fs.chunks.find({files_id:ObjectId('526a922bf8b4aa4d33fdf84d')})

GridFS Sharding

Sharding cũng là một tính năng khác có thể áp dụng với GridFS. Để thu thập các đoạn phân đoạn, người ta có thể sử dụng chỉ mục kết hợp của {files_id:1, n:1} hoặc {files_id:1} làm khóa phân đoạn.

Harshed Sharding chỉ có thể thực hiện được nếu trình điều khiển MongoDB không chạy filemd5.

Tập hợp tệp thường không được phân đoạn vì chúng chỉ chứa siêu dữ liệu và rất nhỏ. Các khóa có sẵn chúng không cung cấp phân phối đồng đều trong một cụm phân đoạn. Tuy nhiên, nếu một người cần phân đoạn bộ sưu tập tệp, bạn có thể sử dụng trường _id kết hợp với một số trường ứng dụng.

Giới hạn của GridFS

Hệ thống tệp GridFS có những hạn chế sau:

  1. Cập nhật nguyên tử: GridFS không có bản cập nhật nguyên tử. Điều này giúp cập nhật thủ công dễ dàng hơn bằng cách chọn phiên bản tệp yêu cầu và giữ cho nhiều phiên bản tệp chạy
  2. Hiệu suất :Hệ thống có xu hướng chậm với hệ thống tệp và máy chủ web.
  3. Bộ làm việc: một người sử dụng một máy chủ khác khi làm việc trên một tập hợp làm việc mới. Điều này được thực hiện để tránh làm phiền bộ máy đang chạy.

Kết luận

GridFS giống như một viên đạn bạc đối với các nhà phát triển có ý định lưu trữ các tệp lớn trong MongoDB. Hệ thống lưu trữ GridFS cung cấp cho các nhà phát triển cơ hội lưu trữ các tệp lớn và truy xuất các phần của tệp cần thiết. Do đó, GridFS là một tính năng MongoDB tuyệt vời có thể được sử dụng với các ứng dụng khác nhau.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cập nhật hàng loạt tài liệu trong MongoDB

  2. MongoDB hoặc CouchDB - phù hợp để sản xuất?

  3. MongoDB là gì và nó hoạt động như thế nào?

  4. Làm cách nào để xóa tài liệu được tham chiếu bởi id trong mongoDB khỏi php?

  5. Quản lý cơ sở dữ liệu hiện đại:ClusterControl - Hướng dẫn