MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Съхранение на файлове в MongoDB с GridFS

Много приложения включват управление на файлове и имат съхранение на файлове като важна функция за подобряване на обработката на данни. Съхранението на файлове често изисква CDN на трета страна (мрежа за доставка на съдържание), като уеб услугите на Amazon, но това прави процеса на управление малко досаден. Би било по-лесно да получите достъп до всичките си ресурси от едно облачно хранилище, а не от множество, тъй като може да има вероятност от неуспех по време на извличането.

Съхраняването на файлове директно в база данни чрез едно извикване на API не беше нещо лесно извършено до въвеждането на GridFS в MongoDB.

Какво е MongoDB GridFS

GridFs е абстракционен слой в MongoDB, използван за съхранение и възстановяване на големи файлове като видео, аудио и изображения. Тази файлова система съхранява файлове, които са дори по-значими от 16 MB в колекциите от данни на MongoDB. Файловете се съхраняват, като първо се разделят на по-малки парчета данни, като всяка част има размер от 255 KB.

GridFS използва две системи за събиране за съхранение на файлове:

  1. Чанк :Това е колекцията, която съхранява частите на документа. Парчетата са ограничени до размер от 255 KB всяка и когато се направи заявка, драйверът на GridFS сглобява отново всички парчета според уникален _id за съхранение. Например, бихте могли да искате да извлечете сегмент от видео файл, а не целия файл, това е възможно само чрез заявка за правилния диапазон, който искате.
  2. Файл :Това съхранява последващите допълнителни метаданни за файла.

Колекциите се поставят в общ пакет и след това се поставя префикс към всяка с името на кофа, което по подразбиране е fs и така имаме:

  • fs.chunks
  • fs.files

Може да се избере различно име на групата, но пълното име на колекцията подлежи на:ограничение на пространството за имена от 255 байта.

Колекция от парчета

Документите за събиране на парчета имат формата: 

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Къде:

  • _id:е уникалният идентификатор за парчето
  • files_id:е _id на родителския документ, както се съхранява в колекцията от файлове
  • n:е поредният номер на частта, започваща с 0.
  • данни:е полезното натоварване на парчето като BSON двоичен тип.

Използва се комбиниран индекс, използващ file_id и n полета, за да позволи ефективно извличане на парчета, например:

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

За да създадете този индекс, ако не съществува, можете да изпълните следната команда на mongo shell:

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

Колекция от файлове

Документите в тази колекция приемат формата

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Къде:

  •  _id:е уникалният идентификатор за документа, който е от типа данни, който човек избира за оригиналния документ и по подразбиране в MongoDB е BSON ObjectId.
  • дължина:е размерът на документа в байтове
  • chunkSize:размер на всяка част, който е ограничен до 255 килобайта
  • uploadDate:поле от тип Дата, което съхранява датата, на която документът е съхранен за първи път.
  • име на файл:това е незадължително поле, което е четима от човека идентификация за файла.
  • метаданни:това е незадължително поле, което съдържа допълнителна информация, която човек иска да съхрани.

По-долу е показан пример за fs файл.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

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

   "length": NumberInt(312)

}

Подобно на колекцията chunks, комбиниран индекс, използващ полета filename и uploadDate, се използва в колекцията от файлове, за да позволи ефективно извличане на файлове, например:

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

За да създадете този индекс, ако не съществува, можете да изпълните следната команда на mongo shell:

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

Кога да използвате системата за съхранение на MongoDB GridFS

MongoDB GridFS не се използва често, но  следното е условието, което може да наложи използването на тази система за съхранение на GridFS;

  •  Когато текущата файлова система има ограничение за броя на файловете, които могат да се съхраняват в дадена директория.
  •  Когато някой възнамерява да получи достъп до част от съхранената информация, GridFS дава възможност да извика части от файла, без да има достъп до целия документ.
  • Когато някой възнамерява да разпространява файлове и техните метаданни чрез географски разпределени набори реплики, GridFS позволява на метаданните да се синхронизират и разгръщат автоматично в множество целеви системи.

Кога да не се използва системата за съхранение на MongoDB GridFS

Системата за съхранение на GridFS обаче не е подходяща за използване, когато ще има нужда от актуализиране на съдържанието на целия файл, записан в GridFS.

Как да добавяте файлове към GridFS

Когато съхранявате mp3 файл в MongoDB с помощта на GridFs, правилната процедура, която трябва да следвате, е следната;

  1. Отворете терминала (командния ред)
  2. Отидете до mongofiles.exe (това се намира в папката bin)
  3. Използвайте командата 
    >mongofiles.exe -d gridfs put song.mp3

След командата името на базата данни, която ще се използва, е gridfs, ако случайно името липсва, MongoDB автоматично създава документ, който съхранява файла в базата данни.

За да видите файла, съхранен в GridFS, използвайте командата за заявка по-долу в обвивката на mongo;

>db.fs.files.find()

Командата връща документ с формат, показан по-долу:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

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

   length: 10302960

}

Файлът има следните подробности, име на файл,  дължина, дата на качване, размер на парче  и object_id. Парчетата в колекцията fs.chunks могат да се видят с помощта на идентификатора, върнат в първоначалната заявка, както е показано по-долу.

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

GridFS Sharding

Разделянето също е друга функция, приложима с GridFS. За колекция от фрагменти от фрагменти може да се използва или комбиниран индекс от { files_id :1, n :1 } или { files_id :1 } като ключ за сегмент.

Изкривеното разделяне е възможно само ако драйверите на MongoDB не изпълняват filemd5.

Колекциите от файлове често не се разделят, защото съдържат само метаданни и  са много малки. Наличните ключове също не осигуряват равномерно разпределение в разделен клъстер. Ако обаче трябва да разделите колекция от файлове, можете да използвате полето _id в комбинация с някои полета на приложението.

Ограничения на GridFS

Файловата система GridFS има следните ограничения:

  1. Атомна актуализация: GridFS няма атомна актуализация. Това улеснява ръчното актуализиране, като избирате необходимата версия на файловете и поддържате няколко версии на файлове, работещи.
  2. Ефективност :  системата има тенденция да е бавна с файловата система и уеб сървъра.
  3. Работен комплект: един използва друг сървър, когато работи върху нов работен комплект. Това се прави, за да се избегне нарушаването на работещия работен комплект.

Заключение

GridFS е като сребърен куршум за разработчиците, които възнамеряват да съхраняват големи файлове в MongoDB. Системата за съхранение GridFS дава на разработчиците шанс да съхраняват големи файлове и да извличат части от необходимите файлове. Следователно GridFS е отлична функция на MongoDB, която може да се използва с различни приложения.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Инсталирайте MongoDB Community Edition 4.0 на Linux

  2. Сравнителен анализ на MongoDB – повишаване на производителността на NoSQL

  3. Битката на базите данни NoSQL - Сравняване на MongoDB и CouchDB

  4. Уеб изстъргване и обхождане със Scrapy и MongoDB

  5. Как да поправя моя mongodb?