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

So speichern Sie eine JSON-Datei mit GridFs

Es lohnt sich höchstwahrscheinlich nicht, die Daten mit GridFS in Mongo zu speichern.

Binäre Daten gehören nie wirklich in eine Datenbank, aber wenn die Daten klein sind, überwiegen die Vorteile, sie in die Datenbank zu stellen (Abfragemöglichkeit), die Nachteile (Serverlast, langsam).

In diesem Fall sieht es so aus, als ob Sie Dokumentdaten (JSON) in GridFS speichern möchten. Sie können dies tun und es so speichern, wie Sie andere Binärdaten speichern würden. Die Daten sind jedoch undurchsichtig. Sie können keine JSON-Daten abfragen, die in einem GridFS-Dokument gespeichert sind, sondern nur die Dateimetadaten.

Big Data abfragen

Da Sie erwähnt haben, dass Sie die Daten abfragen möchten, sollten Sie das Format Ihrer Daten überprüfen. Wenn Ihre Daten das im Beispiel aufgeführte Format aufweisen, sind anscheinend keine komplizierten Abfragen erforderlich, sondern nur der Zeichenfolgenabgleich. Es gibt also mehrere Möglichkeiten.

Fall 1:Große Daten, wenige Punkte

Wenn Sie nicht viele Datensätze haben (Paare von field1 und field2 ), aber die Daten für jeden sind groß (field2 enthält viele Bytes), speichern Sie diese an anderer Stelle und speichern Sie nur eine Referenz darauf. Eine einfache Lösung wäre, die Daten (ehemals field2 ) in einer Textdatei auf Amazon S3 speichern und dann den Link speichern. z. B.

{
  field1: “>HWI-ST700660_96:2:1101:1455:2154#[email protected]/1”,
  field2link: "https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png"
}

Fall 2:Kleine Daten, viele Punkte

Wenn jeder Datensatz klein ist (weniger als 16 MB), aber viele Datensätze vorhanden sind, speichern Sie Ihre Daten in MongoDB (ohne GridFS).

Besonderheiten

In Ihrem Fall sind die Daten ziemlich groß und es ist nicht ratsam, sie mit GridFS zu speichern.

Diese Antwort bietet einen Maßstab nach unten. Der Benchmark scheint darauf hinzudeuten, dass die Abrufzeit mehr oder weniger direkt proportional zur Dateigröße ist. Mit der gleichen Konfiguration würde es 80 Sekunden dauern, um ein Dokument aus der Datenbank abzurufen.

Mögliche Optimierungen

Die standardmäßige Chunk-Größe in GridFS beträgt 255 KiB. Möglicherweise können Sie die Zugriffszeiten für große Dateien verkürzen, indem Sie die Chunk-Größe auf das Maximum (16 MB) erhöhen. Wenn die Blockgröße der einzige Engpass ist, würde die Verwendung der Blockgröße von 16 MB die Abrufzeit von 80 Sekunden auf 1,3 Sekunden reduzieren (80 / (16 MB/255 KiB) =1,3). Sie können dies tun, wenn Sie den GridFS-Bucket initialisieren.

new GridFSBucket(db, {chunkSizeBytes: 16000000})

Eine bessere Strategie wäre, den einzigen Dateinamen in Mongo zu speichern und stattdessen die Datei aus dem Dateisystem abzurufen.

Andere Nachteile

Ein weiterer möglicher Nachteil der Speicherung der Binärdaten in Mongo ergibt sich aus diese Seite :"Wenn die Binärdaten groß sind, kann das Laden der Binärdaten in den Speicher dazu führen, dass häufig aufgerufene Textdokumente (strukturierte Daten) aus dem Speicher verschoben werden, oder allgemeiner, dass der Arbeitssatz möglicherweise nicht in den RAM passt. Dies kann sich negativ auswirken die Leistung der Datenbank." [1 ]

Beispiel

Speichern einer Datei in GridFS, angepasst aus dem Mongo GridFS Tutorial

const uri = 'mongodb://localhost:27017/test';

mongodb.MongoClient.connect(uri, (error, db) => {
  const bucket = new mongodb.GridFSBucket(db);

  fs.createReadStream('./fasta-data.json')
    .pipe(bucket.openUploadStream('fasta-data.json'))
    .on('finish', () => console.log('done!'))
  ;
});