MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Speichern von Dateien in MongoDB mit GridFS

Viele Anwendungen beinhalten Dateiverwaltung und Dateispeicherung als wichtige Funktion zur Verbesserung der Datenverarbeitung. Die Dateispeicherung erfordert oft ein CDN (Content Delivery Network) eines Drittanbieters, wie z. B. Amazon Web Services, aber das macht den Verwaltungsprozess etwas mühsam. Es wäre einfacher, auf alle Ihre Ressourcen von einem einzigen Cloud-Speicher aus zuzugreifen, anstatt von mehreren, da beim Abrufen die Möglichkeit eines Fehlers besteht.

Das direkte Speichern von Dateien in einer Datenbank durch einen einzigen API-Aufruf war bis zur Einführung von GridFS in MongoDB nicht einfach.

Was ist MongoDB GridFS

GridFs ist eine Abstraktionsschicht in MongoDB, die zum Speichern und Wiederherstellen großer Dateien wie Videos, Audios und Bilder verwendet wird. Dieses Dateisystem speichert Dateien, die sogar wichtiger als 16 MB in MongoDB-Datensammlungen sind. Die Dateien werden gespeichert, indem sie zunächst in kleinere Datenblöcke aufgeteilt werden, von denen jeder eine Größe von 255 KB hat.

GridFS verwendet zwei Sammlungssysteme zum Speichern von Dateien:

  1. Stück :Dies ist die Sammlung, die die Dokumentteile speichert. Die Chunks sind auf eine Größe von jeweils 255 KB begrenzt, und wenn eine Abfrage durchgeführt wird, setzt der GridFS-Treiber alle Chunks gemäß der eindeutigen _id des Speichers wieder zusammen. Sie möchten beispielsweise ein Segment einer Videodatei anstelle der gesamten Datei abrufen, dies ist möglich, indem Sie einfach den gewünschten Bereich abfragen.
  2. Datei :Dies speichert die daraus resultierenden zusätzlichen Metadaten für die Datei.

Die Sammlungen werden in einem gemeinsamen Bucket platziert und dann wird jeder der Bucket-Name vorangestellt, der standardmäßig fs ist, und so haben wir:

  • fs.chunks
  • fs.files

Man kann einen anderen Bucket-Namen wählen, aber der vollständige Sammlungsname unterliegt:Namespace-Limit von 255 Bytes.

Chunks-Sammlung

Chunk-Erfassungsdokumente haben folgende Form: 

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Wo:

  • _id:ist die eindeutige Kennung für den Chunk
  • files_id:ist die _id des übergeordneten Dokuments, wie es in der Dateisammlung gespeichert ist
  • n:ist die Sequenznummer des Chunks beginnend mit 0.
  • data:ist die Nutzlast des Chunks als BSON-Binärtyp.

Ein zusammengesetzter Index mit files_id und n Feldern wird verwendet, um ein effizientes Abrufen von Chunks zu ermöglichen, zum Beispiel:

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

Um diesen Index zu erstellen, falls er nicht existiert, können Sie den folgenden Befehl auf einer Mongo-Shell ausführen:

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

Dateisammlung

Dokumente in dieser Sammlung haben die Form

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Wo:

  •  _id:ist die eindeutige Kennung für das Dokument, die den Datentyp hat, den man für das Originaldokument auswählt, und ist in MongoDB standardmäßig die BSON ObjectId.
  • Länge:ist die Größe des Dokuments in Bytes
  • chunkSize:Größe jedes Chunks, die auf 255 Kilobyte begrenzt ist
  • uploadDate:Feld vom Typ Date, das das Datum speichert, an dem das Dokument zum ersten Mal gespeichert wurde.
  • Dateiname:Dies ist ein optionales Feld, das eine für Menschen lesbare Identifikation für die Datei darstellt.
  • Metadaten:Dies ist ein optionales Feld, das zusätzliche Informationen enthält, die man speichern möchte.

Ein Beispiel einer fs-Datei ist unten gezeigt.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

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

   "length": NumberInt(312)

}

Wie bei der chunks-Sammlung wird ein zusammengesetzter Index mit den Feldern filename und uploadDate in der files-Sammlung verwendet, um ein effizientes Abrufen von Dateien zu ermöglichen, zum Beispiel:

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

Um diesen Index zu erstellen, falls er nicht existiert, können Sie den folgenden Befehl auf einer Mongo-Shell ausführen:

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

Wann sollte das MongoDB GridFS-Speichersystem verwendet werden

MongoDB GridFS wird nicht häufig verwendet, aber die folgenden Bedingungen können die Verwendung dieses GridFS-Speichersystems erforderlich machen;

  •  Wenn das aktuelle Dateisystem die Anzahl der Dateien begrenzt, die in einem bestimmten Verzeichnis gespeichert werden können.
  •  Wenn man beabsichtigt, auf einen Teil der gespeicherten Informationen zuzugreifen, ermöglicht GridFS es einem, Teile der Datei abzurufen, ohne auf das gesamte Dokument zugreifen zu müssen.
  • Wenn man beabsichtigt, Dateien und ihre Metadaten über geografisch verteilte Replikatsätze zu verteilen, ermöglicht GridFS den Metadaten, die Daten automatisch zu synchronisieren und auf mehreren Zielsystemen bereitzustellen.

Wann sollte das MongoDB GridFS-Speichersystem nicht verwendet werden

Das GridFS-Speichersystem ist jedoch nicht geeignet, wenn der Inhalt der gesamten in GridFS gespeicherten Datei aktualisiert werden muss.

Wie man Dateien zu GridFS hinzufügt

Wenn Sie eine MP3-Datei in MongoDB mit GridFs speichern, ist die richtige Vorgehensweise wie folgt:

  1. Öffnen Sie das Terminal (Die Eingabeaufforderung)
  2. Navigieren Sie zu mongofiles.exe (diese befindet sich im Ordner bin)
  3. Verwenden Sie den Befehl 
    >mongofiles.exe -d gridfs put song.mp3

Nach dem Befehl ist der Name der zu verwendenden Datenbank das gridfs, falls zufällig der Name fehlt, erstellt MongoDB automatisch ein Dokument, das die Datei auf der Datenbank speichert.

Um die in GridFS gespeicherte Datei anzuzeigen, verwenden Sie den Abfragebefehl unten auf der Mongo-Shell;

>db.fs.files.find()

Der Befehl gibt ein Dokument mit dem unten gezeigten Format zurück:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

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

   length: 10302960

}

Die Datei hat die folgenden Details:Dateiname, Länge, Upload-Datum, Blockgröße und Objekt-ID. Die Chunks in der fs.chunks-Sammlung können mit der ID angezeigt werden, die in der ursprünglichen Abfrage zurückgegeben wird, wie unten gezeigt.

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

GridFS-Sharding

Sharding ist auch eine weitere Funktion, die mit GridFS anwendbar ist. Um die Chunks-Sammlung zu fragmentieren, kann man entweder einen zusammengesetzten Index von { files_id :1, n :1 } oder { files_id :1 } als Shard-Schlüssel verwenden.

Harshed Sharding ist nur möglich, wenn die MongoDB-Treiber filemd5 nicht ausführen.

Dateisammlungen werden häufig nicht fragmentiert, da sie nur Metadaten enthalten und sehr klein sind. Die verfügbaren Schlüssel bieten auch keine gleichmäßige Verteilung in einem Sharding-Cluster. Wenn jedoch eine Dateisammlung fragmentiert werden muss, können Sie das _id-Feld in Kombination mit einigen Anwendungsfeldern verwenden.

GridFS-Einschränkungen

Das GridFS-Dateisystem hat die folgenden Einschränkungen:

  1. Atomisches Update: GridFS hat kein atomares Update. Dies erleichtert die manuelle Aktualisierung, indem die erforderliche Dateiversion ausgewählt und mehrere Dateiversionen ausgeführt werden
  2. Leistung :  das System neigt dazu, mit dem Dateisystem und dem Webserver langsam zu sein.
  3. Arbeitsset: man verwendet einen anderen Server, wenn man an einem neuen Arbeitssatz arbeitet. Dies geschieht, um das laufende Arbeitsset nicht zu stören.

Fazit

GridFS ist wie eine Wunderwaffe für Entwickler, die beabsichtigen, große Dateien in MongoDB zu speichern. Das GridFS-Speichersystem gibt Entwicklern die Möglichkeit, große Dateien zu speichern und Teile der benötigten Dateien abzurufen. GridFS ist daher ein hervorragendes MongoDB-Feature, das mit verschiedenen Anwendungen verwendet werden kann.