MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Przechowywanie plików w MongoDB za pomocą GridFS

Wiele aplikacji obejmuje zarządzanie plikami i posiada przechowywanie plików jako ważną funkcję usprawniającą przetwarzanie danych. Przechowywanie plików często wymaga zewnętrznej sieci CDN (Content Delivery Network), takiej jak usługi Amazon Web, ale to sprawia, że ​​proces zarządzania jest nieco nużący. Łatwiej byłoby uzyskać dostęp do wszystkich zasobów z jednego magazynu w chmurze, a nie z wielu, ponieważ może istnieć ryzyko niepowodzenia podczas pobierania.

Przechowywanie plików bezpośrednio w bazie danych za pomocą pojedynczego wywołania API nie było czymś łatwym do wykonania przed wprowadzeniem GridFS w MongoDB.

Co to jest MongoDB GridFS

GridFs to warstwa abstrakcji w MongoDB używana do przechowywania i odzyskiwania dużych plików, takich jak wideo, audio i obrazy. Ten system plików przechowuje pliki, które są nawet większe niż 16 MB w zbiorach danych MongoDB. Pliki są przechowywane, najpierw dzieląc je na mniejsze porcje danych, z których każdy ma rozmiar 255 KB.

GridFS używa dwóch systemów gromadzenia do przechowywania plików:

  1. Część :To jest kolekcja, która przechowuje części dokumentu. Fragmenty są ograniczone do rozmiaru 255 KB każda, a po wykonaniu zapytania sterownik GridFS ponownie składa wszystkie fragmenty zgodnie z unikalnym identyfikatorem _id pamięci. Na przykład możesz chcieć pobrać segment pliku wideo, a nie cały plik, jest to możliwe po prostu pytając o właściwy zakres.
  2. Plik :To przechowuje wynikające z tego dodatkowe metadane dla pliku.

Kolekcje są umieszczane we wspólnym wiaderku, a następnie poprzedzone nazwą wiaderka, która domyślnie to fs, a więc mamy:

  • fs.chunks
  • fs.files

Można wybrać inną nazwę zasobnika, ale pełna nazwa kolekcji podlega:limitowi przestrzeni nazw do 255 bajtów.

Kolekcja kawałków

Dokumenty pobierania fragmentów mają postać: 

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Gdzie:

  • _id:to unikalny identyfikator porcji
  • files_id:to _id nadrzędnego dokumentu przechowywanego w kolekcji plików
  • n:to numer sekwencyjny porcji zaczynającej się od 0.
  • dane:to ładunek porcji jako typ binarny BSON.

Złożony indeks wykorzystujący file_id i n pól jest używany do wydajnego wyszukiwania fragmentów, na przykład:

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

Aby utworzyć ten indeks, jeśli nie istnieje, możesz uruchomić następujące polecenie w powłoce mongo:

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

Kolekcja plików

Dokumenty w tej kolekcji mają formę

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Gdzie:

  •  _id:to unikalny identyfikator dokumentu, którego typ danych wybiera się dla oryginalnego dokumentu i domyślnie w MongoDB to BSON ObjectId.
  • długość:to rozmiar dokumentu w bajtach
  • chunkSize:rozmiar każdego fragmentu, który jest ograniczony do 255 kilobajtów
  • uploadDate:pole typu Data, które przechowuje datę pierwszego zapisania dokumentu.
  • nazwa pliku:jest to opcjonalne pole, które jest czytelną dla człowieka identyfikacją pliku.
  • metadane:jest to opcjonalne pole, które zawiera dodatkowe informacje, które chcesz przechowywać.

Przykład pliku fs jest pokazany poniżej.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

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

   "length": NumberInt(312)

}

Podobnie jak w przypadku kolekcji chunks, w kolekcji plików używany jest indeks złożony wykorzystujący pola Nazwa pliku i Data przesłania, aby umożliwić wydajne wyszukiwanie plików, na przykład:

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

Aby utworzyć ten indeks, jeśli nie istnieje, możesz uruchomić następujące polecenie w powłoce mongo:

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

Kiedy używać systemu pamięci masowej MongoDB GridFS

MongoDB GridFS nie jest powszechnie używany, ale poniższe warunki mogą wymagać użycia tego systemu pamięci masowej GridFS;

  •  Gdy bieżący system plików ma limit liczby plików, które można przechowywać w danym katalogu.
  •  Gdy ktoś zamierza uzyskać dostęp do części przechowywanych informacji, GridFS umożliwia przywołanie części pliku bez dostępu do całego dokumentu.
  • Gdy ktoś zamierza dystrybuować pliki i ich metadane za pomocą geograficznie rozproszonych zestawów replik, GridFS umożliwia automatyczną synchronizację metadanych i wdrażanie danych w wielu docelowych systemach.

Kiedy nie używać systemu pamięci masowej MongoDB GridFS

System przechowywania GridFS nie jest jednak odpowiedni do użycia, gdy zajdzie potrzeba aktualizacji zawartości całego pliku zapisanego w GridFS.

Jak dodawać pliki do GridFS

Podczas przechowywania pliku mp3 w MongoDB przy użyciu GridFs, właściwa procedura jest następująca;

  1. Otwórz terminal (Wiersz poleceń)
  2. Przejdź do mongofiles.exe (znajduje się w folderze bin)
  3. Użyj polecenia 
    >mongofiles.exe -d gridfs put song.mp3

Po poleceniu nazwa bazy danych, która ma być użyta, to gridfs, jeśli przypadkiem brakuje nazwy, MongoDB automatycznie tworzy dokument, który przechowuje plik w bazie danych.

Aby wyświetlić plik przechowywany w GridFS, użyj poniższego polecenia zapytania w powłoce mongo;

>db.fs.files.find()

Polecenie zwraca dokument w formacie pokazanym poniżej:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

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

   length: 10302960

}

Plik zawiera następujące szczegóły:nazwę pliku, długość, datę przesłania, rozmiar fragmentu i identyfikator obiektu. Fragmenty w kolekcji fs.chunks można wyświetlić przy użyciu identyfikatora zwróconego w początkowym zapytaniu, jak pokazano poniżej.

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

Sharding GridFS

Sharding to także kolejna funkcja dostępna w GridFS. Aby zebrać fragmenty fragmentów, można użyć indeksu złożonego { files_id :1 :n :1 } lub { files_id :1 } jako klucza fragmentu.

Harshed Sharding jest możliwy tylko wtedy, gdy sterowniki MongoDB nie uruchamiają filemd5.

Kolekcje plików często nie są dzielone na fragmenty, ponieważ zawierają tylko metadane i są bardzo małe. Dostępne klucze nie zapewniają równomiernej dystrybucji w klastrze podzielonym na fragmenty. Jeśli jednak trzeba podzielić kolekcję plików, można użyć pola _id w połączeniu z niektórymi polami aplikacji.

Ograniczenia GridFS

System plików GridFS ma następujące ograniczenia:

  1. Aktualizacja atomowa: GridFS nie ma aktualizacji atomowej. Ułatwia to ręczną aktualizację poprzez wybranie wymaganej wersji plików i utrzymanie uruchomionych wielu wersji plików
  2. Wydajność :system zwykle działa wolno z systemem plików i serwerem internetowym.
  3. Zestaw roboczy: używa się innego serwera podczas pracy nad nowym zestawem roboczym. Odbywa się to, aby uniknąć zakłócania działającego zestawu roboczego.

Wnioski

GridFS jest jak srebrna kula dla programistów, którzy zamierzają przechowywać duże pliki w MongoDB. System przechowywania GridFS daje programistom możliwość przechowywania dużych plików i pobierania części potrzebnych plików. GridFS jest zatem doskonałą funkcją MongoDB, której można używać z różnymi aplikacjami.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $type Operator potoku agregacji

  2. Jak sprawdzić poprawność członków pola tablicowego?

  3. Kiedy należy używać bazy danych NoSQL zamiast relacyjnej bazy danych? Czy można używać obu w tej samej witrynie?

  4. MongoDB na Ubuntu nie uruchamia się jako usługa, nic w dzienniku

  5. Pula połączeń bazy danych MongoDB Java Driver z Tomcat