MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come salvare un file JSON usando GridFs

Molto probabilmente non vale la pena archiviare i dati in Mongo usando GridFS.

I dati binari non appartengono mai realmente a un database, ma se i dati sono piccoli, i vantaggi di inserirli nel database (capacità di eseguire query) superano gli svantaggi (carico del server, lento).

In questo caso, sembra che desideri archiviare i dati del documento (JSON) in GridFS. Puoi farlo e memorizzarlo nel modo in cui memorizzeresti qualsiasi altro dato binario. I dati, tuttavia, saranno opachi. Non puoi eseguire query sui dati JSON archiviati in un documento GridFS, solo sui metadati del file.

Interrogazione di big data

Come hai detto che volevi interrogare i dati, dovresti controllare il formato dei tuoi dati. Se i tuoi dati sono nel formato elencato nell'esempio, sembra che non siano necessarie query complicate, solo la corrispondenza di stringhe. Quindi ci sono diverse opzioni.

Caso 1:dati di grandi dimensioni, pochi punti

Se non hai molti set di dati (coppie di field1 e field2 ) ma i dati per ciascuno sono grandi (field2 contiene molti byte), archiviarli altrove e archiviare solo un riferimento a quello. Una soluzione semplice sarebbe quella di memorizzare i dati (precedentemente field2 ) in un file di testo su Amazon S3 e archiviare quindi archiviare il collegamento. es.

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

Caso 2:piccoli dati, molti punti

Se ogni tuo set di dati è piccolo (meno di 16 MB) ma ci sono molti set di dati, archivia i tuoi dati in MongoDB (senza GridFS).

Specifiche

Nel tuo caso, i dati sono piuttosto grandi e archiviarli utilizzando GridFS è sconsigliabile.

Questa risposta fornisce un punto di riferimento verso il basso. Il benchmark sembra indicare che il tempo di recupero è più o meno direttamente proporzionale alla dimensione del file. Con la stessa configurazione, ci vorrebbero 80 secondi per recuperare un documento dal database.

Possibili ottimizzazioni

La dimensione del blocco predefinita in GridFS è 255 KiB. Potresti essere in grado di ridurre i tempi di accesso a file di grandi dimensioni aumentando la dimensione del blocco al massimo (16 MB). Se la dimensione del blocco è l'unico collo di bottiglia, l'utilizzo della dimensione del blocco di 16 MB ridurrebbe il tempo di recupero da 80 secondi a 1,3 secondi (80 / (16 MB/255 KiB) =1,3). Puoi farlo durante l'inizializzazione del bucket GridFS.

new GridFSBucket(db, {chunkSizeBytes: 16000000})

Una strategia migliore sarebbe quella di memorizzare l'unico nome di file in Mongo e recuperare invece il file dal filesystem.

Altri inconvenienti

Un altro possibile inconveniente della memorizzazione dei dati binari in Mongo deriva da questo sito :"Se i dati binari sono di grandi dimensioni, il caricamento dei dati binari in memoria può causare l'espulsione dalla memoria dei documenti di testo (dati strutturati) a cui si accede di frequente o, più in generale, il working set potrebbe non adattarsi alla RAM. Ciò può avere un impatto negativo le prestazioni del database." [1 ]

Esempio

Salvataggio di un file in GridFS, adattato dal Tutorial Mongo GridFS

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!'))
  ;
});